2012-06-18 15 views
6

C kaynakları aramaya kadar gittim, ancak bu işlevi bulamıyorum ve kesinlikle bir tane yazmak istemiyorum çünkü kesinlikle orada olması gerekir.Unicode (UTF-8) kod noktasını baytlara çevir

Ayrıntı yapmak için: Unicode noktaları U + ######## olarak gösterilmektedir - bu ne kolaydır, ihtiyacım olan şey karakterin bir dosyaya yazılması biçimidir (örneğin). Bir Unicode kod noktası, baytları en sağdaki baytın 7 biti ilk bayta yazacak şekilde çevirir, sonra sonraki bitlerin 6 biti bir sonraki bayt ve benzerlerine yazılır. Emacs kesinlikle nasıl yapılacağını bilir, ancak bayt dizisinden (her biri 8 bit içeren) bayt dizisi UTF-8 kodlanmış dizesini elde etmenin bir yolu yoktur.

get-byte veya multybite-char-to-unibyte gibi işlevler, yalnızca 8 bit kullanılmadan gösterilebilen karakterlerle çalışır. get-byte'un aynı şeylere ihtiyacım var, ancak çok baytlı karakterler için, tamsayı 0..256 yerine tamsayı 0..256 veya tek uzun tamsayı 0..2^32 olsun.

DÜZENLEME herkes bu daha sonra ihtiyacınız olacak Ne olur ne

:

(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)))))))) 

cevap

5

encode-coding-string aradığınız şey olabilir:

*** 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" 

Bir dize döndürür, ancak Tek tek baytlara aref:

ile erişebilirsiniz.

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) 
: Eğer cl işlevleri kullanarak sakıncası yoksa
ELISP> (aref (encode-coding-string "eĥoŝanĝo ĉiuĵaŭde" 'utf-8) 1) 
196 
ELISP> (format "%o" 196) 
"304" 

veya concatenate senin arkadaşın