2012-09-06 1 views
3

개체를 인코딩하는 데 CL-JSON을 사용하고 있습니다. 인코딩 된 문자열을 ASCII 형식으로 출력하고 비 ASCII 문자는 "\ uxxxx"형식의 ASCII 문자 시퀀스로 기록됩니다. 결과적으로 외부 형식 utf-8을 사용하여 출력 파일 스트림을 열어도 파일에 ASCII 문자 만 포함됩니다. 예를 들어 notepad ++로 보려고하면 이제는 모든 데이터가 ASCII ("\ uXXXX"시퀀스 일지라도)이기 때문에 유니 코드로 변환 할 수 없습니다. 파일을 유니 코드로 자동 변환하고 해당 이스케이프 시퀀스를 인식하는 편집기가 있는지 또는 CL-JSON이 출력 문자를 유니 코드로 유지할 수 있는지 알려주고 싶습니다. 어떤 아이디어?CL-JSON은 유니 코드 이스케이프 문자열을 ASCII 형식으로 출력하여 유니 코드 문자를 인코딩합니다. 어떻게 이것을 무시할 수 있습니까?

편집 : 여기에 좀 더 정보입니다 :

CL-USER>(with-open-file (out "dump.json" 
          :direction :output 
          :if-does-not-exist :create 
          :if-exists :overwrite 
          :external-format :utf-8) 
      (json:encode-json '("abcd" "αβγδ") out) 
      (format out "~%")) 

CL-USER>(quit) 

bash$ file dump.json 
dump.json: ASCII text 
bash$ cat dump.json 
["abcd","\u03B1\u03B2\u03B3\u03B4"] 
bash$ uname -a 
Linux suse-server 3.0.38-0.5-default #1 SMP Fri Aug 3 09:02:17 UTC 2012 (358029e) x86_64 x86_64 x86_64 GNU/Linux 
bash$ sbcl --version 
SBCL 1.0.50 
bash$ 

EDIT2 :

YASON 내가 \ Uxxxx에 형식을 탈출하지 않고 문자를 출력 필요한 작업,하지만 불행히도 그것은 내가 필요로하는 기능이 부족, 그래서 옵션이 아닙니다.

+0

죄송합니다. 어떤 도움도 드릴 수 없습니다. cl-json의 문서는 실제로 CMUCL의 디코드 문제를 제외하고는 유니 코드를 언급하지 않습니다. 그러나 참조 용으로 몇 가지 최소 코드를 게시하고 사용중인 플랫폼에 대해 언급 하시겠습니까? – gimpf

+0

내가 요청한 정보를 추가했습니다. – Paralife

+0

인코딩의 범인 인 것처럼 보입니다. [here] (http://common-lisp.net/project/cl-json/darcs/cl-json/src/encoder.lisp) in 'write-json-chars' 문자가 # x1f와 # x7f (32 & 127) 사이에 있어야한다는 하드 코딩 된 검사가 있습니다. 그렇지 않으면 문자가 이스케이프됩니다. [decoder.lisp] (http://common-lisp.net/project/cl-json/darcs/cl-json/src/decoder.lisp)에서'read-json-string-char'에서 이스케이프 처리 실행 취소되지만 명시적인 범위 검사가 수행되지 않습니다. 'write-json-chars'의 복사본을 특별한 변수와 함께 패치하여 출력 이스케이프를 조건부로 비활성화 할 수 있습니다. – Lex

답변

3

이것이 임시 해결책이라는 것을 알고 있지만 ASCII 외부의 유니 코드 이스케이프 범위가 아닌 적절한 기능을 재정 의하여 CL-JSON 소스를 변경했습니다. 이 함수의 이름은 write-json-chars이며 소스의 파일 encoder.lisp에 있습니다.

관련 문제