2

BOM なしで UTF-8 でエンコードされた xml ファイルがあります。16 進エディタでは、次のようになります。3c 3f 78 6d

xml ファイルをバッファリングし、先頭に BOM を追加します。

char* BufferEncoder = (char*)malloc(3);
memset(BufferEncoder, 0, size);
for(int i=0;i<3;i++) BufferEncoder[i] ^= 0xaa;
BufferEncoder[0]=(char)0xef;
BufferEncoder[1]=(char)0xbb;
BufferEncoder[2]=(char)0xbf;
// concatenate into a new Buffer containing old xml and the BOM

次に、次のコード行を使用して、BOM 付きの UTF-8 から ISO 8859-1 に変換しようとしました。

int size = WideCharToMultiByte(28591 /*ISO-8859-1*/, 0,  pBuffer, -1, NULL, 0, NULL, 0);
if (size>0)
{
    char* pBuffer2 = (char*)malloc(size);
    memset(pBuffer2, 0, sizeNew);
    WideCharToMultiByte(28591, 0,pBuffer,-1, pBuffer2, size, NULL, 0);
    // .........

このコードはまだテストされていません。これが最善の解決策だと思いますか? どんなアイデアやアドバイスも大歓迎です。前もって感謝します。

4

1 に答える 1

1

コメントで触れたように、この考え方には、いわばいくつかの質問が必要だと思います。

  1. そもそもなぜこの変換を行うのですか?

  2. あなたは実際に何をするか知ってWideCharToMultiByte()いますか?

私自身、正確に何が機能するかについて完全に明確ではないことを率直に認めますWideCharToMultiByte()。しかし、ここでは、ワイド文字の文字列をマルチバイト文字の文字列に変換すると仮定します。ドキュメントをざっと見ると、これを新しいバッファに入れ、新しい文字列の長さを返すように見えます。

これはすべて順調でダンディです。問題は、UTF-8 が実際にはワイド文字エンコーディングではないことです。ISO-8859-1 はマルチバイト エンコーディングではありません。UTF-8マルチバイト エンコーディングです。しかし、この場合、それはあまり役に立ちません。

私のアドバイス; 次に、文字エンコーディングについて調べます。特に UTF-8 (マルチバイト) と UTF-16 (ワイド) の違いについて。

また、何をしようとしても、実際に UTF-8 文字列を受け入れる別のインターフェイスを見つけることをお勧めします。ISO-8859-1 文字列を必要とするインターフェイスは、特に XML を扱う場合、非常にレガシーで、完全に正気ではないように思えるからです。

もちろん、全体として何を達成しようとしているのかを実際に述べていたでしょうか。より具体的なアドバイスが可能です。

編集:あなたの難問を正しく理解している場合、問題は、ASCII 範囲外の文字 (U+0…U+127) を含む可能性がある、正しくフォーマットされ、エンコードされた XML ファイルを取得していることです。これが問題である場合、ISO-8859-1 を何らかの形で使用すると、今後のすべての頭痛の種になります。

エンコーディングの問題

テキスト ファイルに ASCII 範囲外の文字を含めることができる場合、おそらく ASCII 範囲外の任意の文字を含めることができます。UTF-8 は任意の文字を表すことができますが、これは ISO-8859-1 には当てはまりません。

言い換えると; エンコーディングを虐待するインターフェースに固執する場合の最良のシナリオは、情報の不可逆的な損失です。最悪のシナリオは、クラッシュと焼失です。

私のポイントは、壊れたインターフェースを甘やかすな、決して UTF-8 を使用しないということです。

于 2011-06-23T19:53:15.980 に答える