-1

UTF-8でエンコードされたテキストファイルをC++Builder5プログラムにインポートする必要があります。それを実現するためのコンポーネントやコードサンプルはありますか?

4

4 に答える 4

2

これは、より VCL 中心のアプローチです。

UTF8String utf8 = "...";
WideString utf16;
AnsiString latin1;

int len = ::MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), utf8.Length(), NULL, 0);
utf16.SetLength(len);
::MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), utf8.Length(), utf16.c_bstr(), len);

len = ::WideCharToMultiByte(1252, 0, utf16.c_bstr(), utf16.Length(), NULL, 0, NULL, NULL);
latin1.SetLength(len);
::WideCharToMultiByte(1252, 0, utf16.c_bstr(), utf16.Length(), latin1.c_str(), len, NULL, NULL);

CB2009 にアップグレードする場合は、次のように簡略化できます。

UTF8String utf8 = "...";
AnsiString<1252> latin1 = utf8;
于 2009-07-14T00:54:42.617 に答える
2

unicode および c++ のタグが付けられた SO に関する他のすべての質問を読むことをお勧めします。手始めに、おそらくこれを見て、受け入れられた回答のライブラリ(UTF8-CPP)が機能するかどうかを確認する必要があります。

ただし、UTF-8でエンコードされた文字列を「Ansi」にインポートする方法がないため、最初に何を達成しようとしているのかを考えます(ISO8859_1やWIN1252エンコーディングのようなものでしょうか?) .

于 2009-01-24T12:20:07.983 に答える
0

週末は誰も働いていないので、自分で答えなければなりません:)

String Utf8ToWinLatin1(char* aData, char* aValue)
{
    int i=0;
    for(int j=0;j<strlen(aData);)
    {   int val=aData[j];
        int c=(unsigned char)aData[j];
        if(c<=127)
        {   aValue[i]=c;
            j+=1;                                  
            i++;
        }
        else if(c>=192 && c<=223)
        {
            aValue[i]=(c-192)*64 + (aData[j+1]-128);
            i++;
            j+=2;
        }
        else if(c>=224 && c<=239)
        {
            aValue[i]=( c-224)*4096 + (aData[j+1]-128)*64 + (aData[j+2]-128);
            i++;
            j+=3;
        }
        else if(c>=240 && c<=247)
        {
            aValue[i]=(c-240)*262144 + (aData[j+1]-128)*4096 + (aData[j+2]-128)*64 + (aData[j+3]-128);
            i++;
            j+=4;
        }
        else if(c>=248 && c<=251)
        {
            aValue[i]=(c-248)*16777216 + (aData[j+1]-128)*262144+ (aData[j+2]-128)*4096 + (aData[j+3]-128)*64 + (aData[j+4]-128);
            i++;
            j+=5;
        }
        else
            j+=1;
    }
    return aValue;
}
于 2009-01-24T11:59:11.787 に答える
-1

あなたの質問は、変換したい文字セットを具体的に述べていません。基本的な 7 ビット ASCII 文字セットのみが必要な場合は、127 より大きい値を持つすべての文字を破棄することで機能します。

latin1 などの 8 ビット文字セットに変換する場合は、難しい方法で行う必要があります。

于 2009-01-24T12:38:34.220 に答える