2012-06-18 20 views
6

Fui tan lejos como buscar fuentes C, pero no puedo encontrar esta función, y realmente no quiero escribir una porque realmente debe estar allí.Traducir punto de código Unicode (UTF-8) a bytes

Elaborar: Los puntos Unicode se representan como U + ######## - esto es fácil de obtener, lo que necesito, es el formato en que se escribe el carácter en un archivo (por ejemplo). Un punto de código Unicode se traduce a bytes de modo que 7 bits del byte más a la derecha se escriben en el primer byte, luego 6 bits de los siguientes bits se escriben en el siguiente byte, y así sucesivamente. Emacs ciertamente sabe cómo hacerlo, pero no hay forma de que pueda encontrar la secuencia de bytes de la secuencia codificada en UTF-8 como una secuencia de bytes (cada uno con 8 bits).

Las funciones como get-byte o multybite-char-to-unibyte funcionan solo con caracteres que pueden representarse utilizando no más de 8 bits. Necesito lo mismo que get-byte, pero para caracteres multibyte, de modo que en lugar de un número entero 0..256 recibiría un vector de números enteros 0..256 o un único entero largo 0..2^32.

EDITAR

Sólo en caso de que alguien lo necesitará más adelante:

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

Respuesta

5

encode-coding-string podría ser lo que estás buscando:

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

devuelve una cadena, pero puede acceder a los bytes individuales con aref:

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

o si no les importa usar cl funciones, concatenate es su amigo:

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) 
Cuestiones relacionadas