0

このテーマに関する他の質問を見ましたが、それらすべてに重要な詳細がありませんでし\u00252F\u00252F\u05de\u05e8\u05db\u05d6た。utf8に変換したいと思います。ストリームを調べて、\ uに続いて、バイトに変換する4つの16進数を探していることを理解しています。問題は次のとおりです。

  1. 4バイト後、6バイト後を探すこともあると聞きましたが、これは正しいですか?もしそうなら、それをどのように判断しますか?たとえば、\u00252F4バイトまたは6バイトですか?
  2. \u0025これが2バイト(0x25)ではなく1バイトにマップされる場合、なぜですか?4つの16進数は、utf8に変換することになっているutf16を表すことになっていますか?
  3. テキストがリテラル文字である\u0025かUnicodeシーケンスであるかを知るにはどうすればよいですか?これは、すべての円記号をストリームでエスケープする必要があることを意味しますか?
  4. 最後に、iconvを使用してこれを実行できるのに、手作業でこれを実行するのは愚かですか?
4

2 に答える 2

2

iconvインターフェイスを自由に使用できる場合は、などのシーケンスをバイトの配列に変換するだけで、エスケープ\u0123\uABCD01 23 AB CDれていないASCII文字を00バイトの後にASCIIバイトに置き換えてからiconv、変換記述子を使用して配列を実行できます。によって取得されiconv_open("UTF-8", "UTF-16-BE")ます。

もちろん、入力を自分で直接操作する方がはるかに効率的に行うこともできますが、UTF-16およびUTF-8のUnicode仕様を読んで理解する必要があります。

于 2012-11-30T19:55:46.237 に答える
0

一部の規則(C ++ 11文字列リテラルなど)では、特定の数の16進数(後の4桁や後\uの8桁など)を解析します\U。それはあなたが提供した入力の慣習であるかもしれないし、そうでないかもしれませんが、それは合理的な推測のようです。C ++のような他のスタイルでは、の\x後に見つけることができる限り多くの16進数を解析します\x。つまり、これらのエスケープ文字の1つの直後にリテラルの16進数を配置する場合は、いくつかのフープをジャンプする必要があります。

すべての値を取得したら、それらが含まれているエンコーディング(UTF-16やUTF-32など)と必要なエンコーディング(UTF-8など)を知る必要があります。次に、関数を使用して、新しいエンコーディングで新しい文字列を作成します。このような関数を作成することも(両方のエンコード形式について十分に理解している場合)、ライブラリを使用することもできます。一部のオペレーティングシステムはそのような機能を提供する場合がありますが、移植性のためにサードパーティのライブラリを使用することをお勧めします。

于 2012-11-30T21:20:45.633 に答える