카테고리 보관물: Language

특수 문자(Special Character) 문제(&#65279)

cvc-complex-type.2.3 오류

09:52:06,504 WARNING [com.hazelcast.web.ClusteredSessionService] (default task-1) Cannot connect to Hazelcast server: cvc-complex-type.2.3: Element 'near-cache' cannot have character [children], because the type's content type is element-only. 
09:52:06,962 WARNING [com.hazelcast.web.HazelcastHttpSession] (default task-1) Unexpected error occurred.: java.lang.NullPointerException 
 at com.hazelcast.web.ClusteredSessionService.updateAttributes(ClusteredSessionService.java:285) 
 at com.hazelcast.web.HazelcastHttpSession.sessionDeferredWrite(HazelcastHttpSession.java:300) 
 at com.hazelcast.web.WebFilter.doFilter(WebFilter.java:303) 
 at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61) 
 at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131) 
 at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84) 
 at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) 
 at io.undertow.jsp.JspFileHandler.handleRequest(JspFileHandler.java:32) 
 at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68) 
 at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) 
 ...
  • 일반적인 오류 해결법
  1. XML 태그 정보 누락 여부 재확인
<?xml version="1.0" encoding="UTF-8" ?>
  1. IDE 문제 – 이클립스 또는 STS 재기동
  2. 오타 여부 재확인 – 특수문자의 오기입 또는 오탈자로 인해 발생 가능 합니다.
  • 그게 아니면…..
  1. UTF-8 인코딩의 BOM(Byte Order Mark) 문제….
  2. UTF-8, UTF-16 등의 유니코드 인코딩 방식을 알리기 위한 사인(Signature)으로 사용하기 위한 용도 입니다.
  3. UTF-8은 BOM 없이도 인코딩 인식이 가능하지만 노트패드등의 윈도우 환경의 일부 에디터가 BOM을 자동으로 추가 하게 되며 눈에 보이지 않는 특수 문자(여백 문자)가 추가 되게 됩니다. 이로 인해 UNIX 환경에서 예상치 않은 cvc-complex-type.2.3 오류가 발생할 수 있습니다.
  • 해결 방안
  1. Notepad++, Ultraeditor, EditPlus 등의 에디터를 이용해 ‘UTF-8 without BOM’ (BOM 없는 UTF-8) 으로 저장
  2. 개인적으로는 BOM 없는 UTF-8로 저장이 안되어서 태그 앞의 여백 부분을 모두 삭제하여 해결 하였습니다.
  3. 윈도우에서 코드를 저장할 때는 항상 인코딩에 주의를 해야할 듯 합니다. 🙂

출처

http://blog.wystan.net/2007/08/18/bom-byte-order-mark-problem

https://ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8_%EC%88%9C%EC%84%9C_%ED%91%9C%EC%8B%9D

^M 개행문자로 인한 Shell Script 오류

Shell Script bad interpreter error

  • Shell Script를 윈도우 환경에서 작성했거나 FTP로 전송하고 리눅스 환경에서 실행하면 아래와 같은 에러 메시지를 마주할 때가 있습니다.
[root@localhost ~]# ./temp.sh 
 -bash: ./temp.sh: /bin/bash^M: bad interpreter: No such file or directory
  • 결론적으로는 윈도우와 리눅스의 개행문자의 차이로 인해 발생하는 현상으로 윈도우는 CRLF, 리눅스는 LF입니다. 대강의 의미는 아래와 같습니다.
LF : Line Feed커서를 한칸 아래로 이동 = 새로운 행 추가(new line feed)
CR : Carriage Return커서를 맨왼쪽으로 이동 = 시작위치로 복귀(return)
https://zetawiki.com/wiki/%EA%B0%9C%ED%96%89%EB%AC%B8%EC%9E%90,%EB%9D%BC%EC%9D%B8%ED%94%BC%EB%93%9C,%EC%BA%90%EB%A6%AC%EC%A7%80%EB%A6%AC%ED%84%B4
  • Binary 타입으로 윈도우의 에디터에서 파일을 저장하거나 FTP로 전송하게 되면 윈도우의 개행문자 “\r\n”가 리눅스의 개행문자 “\n”으로 변환 되지 않게 되어 처음과 같은 현상이 발생하게 됩니다.
  • 해당 상태를 정확히 확인하기 위해서는 vi 편집기를 Binary모드로 실행하면 되고 아래와 같이 확인이 가능합니다.
[root@localhost ~]# vim -b temp.sh

!/bin/bash^M
^M
ls -lh^M
  • 단순히 ^M만 삭제후 저장해도 해결 가능하지만 수백줄이상의 스크립트에서는 작업하기 곤란한 방식이므로 검색, 치환 기능을 이용해 변경할 수 있습니다.
  • 개행문자 ^M은 “Shift + 6”, “Shift + m” 이 아닌 “Ctrl + v + m” 입력해야 합니다.
[root@localhost ~]# vim -b temp.sh

:%s/^M//g
  • 또는 기본 모드로 vi를 실행 후 Last Line Mode에서 설정 입력 후 저장 하는 방법이 있습니다.
[root@localhost ~]# vim temp.sh

:set fileformat=unix
:wq
  • vi 편집기를 사용하기 곤란한 환경에서는 sed 명령으로 해당 개행문자를 치환 할 수 있습니다.
[root@localhost ~]# sed -i -e 's/\r$//' temp.sh

[root@localhost ~]# sed -i -e 's/^M$//' temp.sh     // ^M은 "Ctrl + v + m" 입력
  • 저장하거나 전송할 때 파일 포멧을 선택할 수 있으므로 사전에 신경을 쓰는게 시행착오를 방지하는 방법입니다. 🙂