2012-06-18 14 views
6

Poszedłem aż do wyszukiwania źródeł C, ale nie mogę znaleźć tej funkcji, a ja naprawdę nie chcę napisać samemu, ponieważ to absolutnie musi tam być.Przetłumacz kod kodowy Unicode (UTF-8) na bajty

Aby opracować: punkty Unicode są reprezentowane jako U + ######## - jest to łatwe do zdobycia, to, czego potrzebuję, to format, w jakim znak jest zapisywany do pliku (na przykład). Punkt kodowy Unicode tłumaczy się na bajty tak, że 7 bitów bajtu po prawej stronie jest zapisanych w pierwszym bajcie, a następnie 6 bitów kolejnych bitów jest zapisywane w następnym bajcie i tak dalej. Emacs z pewnością wie, jak to zrobić, ale nie ma sposobu, aby znaleźć ciąg bajtowy kodowanego w UTF-8 łańcucha od niego jako sekwencji bajtów (z których każda zawiera 8 bitów).

funkcje takie jak get-byte lub multybite-char-to-unibyte pracy tylko z postaci, które mogą być reprezentowane przy użyciu nie więcej niż 8 bitów. Potrzebuję tego samego, co robi get-byte, ale dla znaków wielobajtowych, tak że zamiast liczby całkowitej 0..256 otrzymam wektor liczb całkowitych 0..256 lub jedną długą liczbę całkowitą 0..2^32.

EDIT

Tylko w przypadku, ktoś będzie musiał to później:

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

Odpowiedz

5

encode-coding-string może być to, czego szukasz:

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

Zwraca ciąg, ale możesz uzyskać dostęp do poszczególnych bajtów za pomocą aref:

ELISP> (aref (encode-coding-string "eĥoŝanĝo ĉiuĵaŭde" 'utf-8) 1) 
196 
ELISP> (format "%o" 196) 
"304" 

lub jeśli nie przeszkadza cl funkcji concatenate jest twoim przyjacielem:

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) 
Powiązane problemy