代码之家  ›  专栏  ›  技术社区  ›  Riho

用C++Builder 5将UTF-8转换为Wi1252

  •  -1
  • Riho  · 技术社区  · 17 年前

    我必须导入一些UTF-8编码的文本文件到我的C++Builder 5程序中。 是否有任何组件或代码示例来实现这一点?

    4 回复  |  直到 12 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    您最好阅读所有其他问题,以便标记Unicode和C++。首先,你应该看看 this one 看看图书馆是否在接受答案( UTF8-CPP )为你工作。

    不过,我会首先考虑一下您要实现的目标,因为您不可能只将UTF-8编码的字符串导入“ansi”(您所说的是什么意思,可能类似于iso8859_1或win1252编码?).

        2
  •  2
  •   Remy Lebeau    17 年前

    以下是一种以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;
    
        3
  •  0
  •   Riho    17 年前

    因为周末没有人工作,我必须自己回答:)

    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;
    }
    
        4
  •  -1
  •   Stack Overflow is garbage    17 年前

    您的问题并没有具体说明要将哪个字符集转换为哪个字符集。如果您只需要基本的7位ASCII字符集,那么丢弃值高于127的每个字符就可以了。

    如果要转换为8位字符集,如Latin1,则必须采用硬方法。