6

私はCソースを検索するところまで行きましたが、この関数が見つかりません。絶対にそこにあるはずなので、自分で作成したくありません。

詳細に説明すると、UnicodeポイントはU + ########として表されます。これは簡単に取得できます。必要なのは、文字がファイルに書き込まれる形式です(たとえば)。Unicodeコードポイントは、右端のバイトの7ビットが最初のバイトに書き込まれ、次に次のビットの6ビットが次のバイトに書き込まれるようにバイトに変換されます。Emacsは確かにそれを行う方法を知っていますが、UTF-8でエンコードされた文字列のバイトシーケンスをバイトシーケンス(それぞれ8ビットを含む)として取得する方法はありません。

get-byteまたはなどの関数multybite-char-to-unibyteは、8ビット以下で表現できる文字でのみ機能します。同じことが必要ですget-byteが、マルチバイト文字の場合、整数0..256の代わりに、整数0..256のベクトルまたは単一の長整数0..2^32のいずれかを受け取ります。

編集

誰かが後でこれを必要とする場合に備えて:

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

1 に答える 1

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

clまたは、関数の使用を気にしない場合concatenateは、友達ですか:

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)
于 2012-06-18T15:00:12.857 に答える