3

L"hao123--我的上网主页" というワイド文字列があり、"hao123--\u6211\u7684\u4E0A\u7F51\u4E3B\u9875" にエンコードする必要があります。エンコードされた文字列は、Unicode UTF-16 コード ポイントをエンコードするための特別な「%uNNNN」形式であると言われました。このWebサイトでは、JavaScriptエスケープであることがわかります。しかし、C++でエンコードする方法がわかりません。

これを機能させるためのライブラリはありますか?またはヒントを教えてください。

ありがとう、友よ!

4

2 に答える 2

2

文字列リテラルに Unicode を埋め込むことは、一般的には良い考えではなく、移植性がありません。wchar_t が 16 ビットになり、エンコーディングが UTF-16 になるという保証はありません。Microsoft Visual C++ (特定の C++ 実装) を使用する Windows ではこれが当てはまりますが、OS X の GCC (別の実装) では wchar_t は 32 ビットです。ある種のローカライズされた文字列定数がある場合は、構成ファイルを特定のエンコーディングで使用し、それらをそのエンコーディングでエンコードされたものとして解釈するのが最善です。International Components for Unicode (ICU)ライブラリは、Unicodeの解釈と処理をかなり適切にサポートします。エンコーディング形式を変換する (解釈はしない) ためのもう 1 つの優れたライブラリはlibiconvです。

編集
あなたの質問を誤解している可能性があります...問題がすでにUTF-16の文字列を持っていて、それを「unicode-escape ASCII」(つまり、Unicode文字が表されるASCII文字列)に変換したい場合"\u" の後に文字の数値が続く)、次の疑似コードを使用します。

UTF-16 でエンコードされた文字列で表される各コードポイントに対して:
    コードポイントが [0,0x7F] の範囲にある場合:
       char にキャストされたコードポイントを発行する
    そうしないと:
       「\u」の後にコードポイントを表す 16 進数を出力する

ここで、コードポイントを取得するには、非常に単純なルールがあります... UTF-16 文字列の各要素は、「サロゲート ペア」の一部でない限り、コードポイントです。単一のコードポイント。その場合、Unicode 標準では、「先頭のサロゲート」と「末尾のサロゲート」を単一のコード ポイントに結合するための手順が定義されています。UTF-8 と UTF-16 は両方とも可変長エンコーディングであることに注意してください...可変長で表されない場合、コードポイントには 32 ビットが必要です。Unicode Transformation Format (UTF) FAQでは、エンコーディング、サロゲート ペアの識別方法、それらをコードポイントに結合する方法について説明しています。

于 2010-04-21T02:48:20.503 に答える
0

\xの代わりに使用して\uください。

于 2010-04-21T02:48:02.870 に答える