2012-06-18 2 views
6

나는 C 소스를 검색하는 데까지 갔지만이 기능을 찾을 수는 없으며 절대적으로 있어야하기 때문에 직접 작성하고 싶지는 않습니다.유니 코드 (UTF-8) 코드 포인트를 바이트로 변환

정교하게 : 유니 코드 포인트는 U + ########로 표시됩니다. 이것은 쉽게 얻을 수 있습니다. 필요한 것은 파일에 문자를 쓰는 형식입니다 (예 :). 유니 코드 코드 포인트는 가장 오른쪽 바이트의 7 비트가 첫 번째 바이트에 쓰여지고 다음 비트의 6 비트가 다음 바이트에 쓰여지는 식으로 변환됩니다. 이맥스는 확실히 그것을하는 법을 알고 있지만, UTF-8로 인코딩 된 문자열의 바이트 시퀀스를 바이트 시퀀스 (각각 8 비트 포함)로 가져올 방법이 없다.

get-byte 또는 multybite-char-to-unibyte과 같은 기능은 8 비트 이상을 사용하여 표현할 수없는 문자로만 작동합니다. get-byte과 같은 것을 필요로하지만 멀티 바이트 문자의 경우 정수 0..256 대신 0..256의 정수 또는 0.1.2의 단일 정수를받을 수 있습니다.

EDIT 사람이 나중에 필요합니다 그냥 경우

:

(defun haxe-string-to-x-string (s) 
    (with-output-to-string 
    (let (current parts) 
     (dotimes (i (length s)) 
     (if (> 0 (multibyte-char-to-unibyte (aref s i))) 
      (progn 
       (setq current (encode-coding-string 
          (char-to-string (aref s i)) 'utf-8)) 
       (dotimes (j (length current)) 
       (princ (format "\\x%02x" (aref current j))))) 
      (princ (format "\\x%02x" (aref s i)))))))) 

답변

5

encode-coding-string 당신이 찾고있는 무슨 수 있습니다 :

*** Welcome to IELM *** Type (describe-mode) for help. 
ELISP> (encode-coding-string "eĥoŝanĝo ĉiuĵaŭde" 'utf-8) 
"e\304\245o\305\235an\304\235o \304\211iu\304\265a\305\255de" 

그것은 문자열을 반환하지만, aref :

으로 개별 바이트에 액세스 할 수 있습니다.

ELISP> (concatenate 'list (encode-coding-string "eĥoŝanĝo ĉiuĵaŭde" 'utf-8)) 
(101 196 165 111 197 157 97 110 196 157 111 32 196 137 105 117 196 181 97 197 173 100 101) 
: 당신이 cl 기능을 사용하여 괜찮다면
ELISP> (aref (encode-coding-string "eĥoŝanĝo ĉiuĵaŭde" 'utf-8) 1) 
196 
ELISP> (format "%o" 196) 
"304" 

은 또는, concatenate은 당신의 친구입니다

관련 문제