2012-06-18 65 views
6

Tôi đã tìm kiếm nguồn C, nhưng tôi không thể tìm thấy hàm này, và tôi thực sự không muốn viết một bản thân vì nó hoàn toàn phải có.Dịch mã nhị phân Unicode (UTF-8) sang byte

Để xây dựng: Các điểm Unicode được biểu diễn dưới dạng U + ######## - điều này rất dễ nhận, những gì tôi cần, là định dạng ký tự được ghi vào một tệp (ví dụ). Một codepoint Unicode chuyển thành các byte sao cho 7 bit của byte tận cùng bên phải được ghi vào byte đầu tiên, sau đó 6 bit của các bit tiếp theo được ghi vào byte tiếp theo và cứ thế tiếp tục. Emacs chắc chắn biết làm thế nào để làm điều đó, nhưng không có cách nào tôi có thể tìm thấy để có được chuỗi byte của chuỗi mã hóa UTF-8 từ nó như là một chuỗi các byte (mỗi byte chứa 8 bit).

Các chức năng như get-byte hoặc multybite-char-to-unibyte chỉ hoạt động với các ký tự có thể được biểu diễn bằng không quá 8 bit. Tôi cần điều tương tự như những gì get-byte, nhưng đối với các ký tự nhiều byte, do đó thay vì một số nguyên 0..256 tôi sẽ nhận được một vectơ các số nguyên 0..256 hoặc một số nguyên dài 0..2^32.

EDIT

Chỉ trong trường hợp bất cứ ai cũng cần sau này:

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

Trả lời

5

encode-coding-string có thể là những gì bạn đang tìm kiếm:

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

Nó trả về một chuỗi, nhưng bạn có thể truy cập các byte riêng lẻ với aref:

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

hoặc nếu bạn không nhớ sử dụng cl chức năng, concatenate là bạn của bạn:

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) 
Các vấn đề liên quan