Преобразование UTF-8 в WIN1252 с помощью C ++ Builder 5 - PullRequest
0 голосов
/ 24 января 2009

Мне нужно импортировать некоторый текстовый файл в кодировке UTF-8 в мою программу C ++ Builder 5. Есть ли какие-либо компоненты или примеры кода для этого?

Ответы [ 4 ]

2 голосов
/ 14 июля 2009

Вот более 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;
2 голосов
/ 24 января 2009

Лучше всего прочитать все остальные вопросы по SO, которые помечены как Unicode и C ++. Для начала вам следует взглянуть на этот и посмотреть, работает ли библиотека в принятом ответе ( UTF8-CPP ).

Однако я бы сначала подумал о том, чего вы пытаетесь достичь, поскольку нет способа просто импортировать строки в кодировке UTF-8 в «Ansi» (что бы вы ни подразумевали под этим, может быть, что-то вроде ISO8859_1 или WIN1252 кодирование?).

0 голосов
/ 24 января 2009

Ваш вопрос не говорит конкретно, какой набор символов вы хотите преобразовать в. Если вам нужна только базовая 7-битная кодировка ASCII, сработает отбрасывание каждого символа с более высоким значением, чем 127.

Если вы хотите преобразовать в 8-битный набор символов, такой как latin1, вам придется сделать это трудным путем.

0 голосов
/ 24 января 2009

Поскольку по выходным никто не работает, я должен ответить сам:)

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;
}
...