2013-01-12 43 views
0

这是我的C++代码,我试图将收到的文件路径编码为utf-8。C++字符编码

#include <string> 
#include <iostream> 

using namespace std; 
void latin1_to_utf8(unsigned char *in, unsigned char *out); 
string encodeToUTF8(string _strToEncode); 

int main(int argc,char* argv[]) 
{ 

// Code to receive fileName from Sockets 
cout << "recvd ::: " << recvdFName << "\n"; 
string encStr = encodeToUTF8(recvdFName); 
cout << "encoded :::" << encStr << "\n"; 
} 

void latin1_to_utf8(unsigned char *in, unsigned char *out) 
{ 
while (*in) 
{ 
    if (*in<128) 
    { 
    *out++=*in++; 
    } 
    else 
    { 
    *out++=0xc2+(*in>0xbf); 
    *out++=(*in++&0x3f)+0x80; 
    } 
} 
*out = '\0'; 
} 

string encodeToUTF8(string _strToEncode) 
{ 
    int len= _strToEncode.length(); 
    unsigned char* inpChar = new unsigned char[len+1]; 
    unsigned char* outChar = new unsigned char[2*(len+1)]; 
    memset(inpChar,'\0',len+1); 
    memset(outChar,'\0',2*(len+1)); 
    memcpy(inpChar,_strToEncode.c_str(),len); 
    latin1_to_utf8(inpChar,outChar); 
    string _toRet = (const char*)(outChar); 
    delete[] inpChar; 
    delete[] outChar; 
    return _toRet; 
} 

并且输出是

recvd ::: /Users/zeus/ÄÈÊÑ.txt 
encoded ::: /Users/zeus/AÌEÌEÌNÌ.txt 

latin1_to_utf8被作为溶液Convert ISO-8859-1 strings to UTF-8 in C/C++提供的上述功能,看起来像它的工作原理。[答案已被接受。所以我认为我必须犯一些错误,但我无法确定它是什么。有人可以帮我解决这个问题,请。

我第一次在Codereview中发布了这个问题,但我没有得到任何答案。所以很抱歉重复。

+0

为什么你认为有问题? – Mat

+0

@Mat我使用编码的文件名将它发送回我的文件服务器,我无法发送它没有正确的编码,但正如你可以看到编码后,它似乎有更多的字符 – Zeus

+0

是的,这是完全正常和预期。拉丁文中的每个127以上的字符都将用UTF-8中的两个字节进行编码。 – Mat

回答

0

您首先将原始Latin-1字符串输出到期待特定编码的终端,可能是Latin-1。然后,您将代码转换为UTF-8并将其输出到同一个终端,这会对其进行不同的解释。经典mojibake。尝试与输出,而不是以下:

for(size_t i=0, len=strlen(outChar); i!=len; ++i) 
    std::cout << static_cast<unsigned>(static_cast<unsigned char>(outChar[i])) << ' '; 

注意这两个石膏是首先得到了无符号字节值,然后获得无符号值把它当作一个字符保持流。请注意,你的char可能已经没有签名,但是这是依赖于编译的。

1

你使用任何平台,或者你建立在std的顶部吗?我相信很多人使用这种转换,因此有图书馆。我强烈建议你使用libraray,因为这个库已经过测试,并且通常使用最好的方法。

,我发现这样一个图书馆boost locale

这是标准的。如果你使用QT,我会建议你使用这个QT转换库(它是平台独立的)

QT

如果你想自己做(你想看看它是如何工作或任何其他原因) 1.确保分配内存! - 这在C,C++中非常重要。因为你使用iostream来使用new来分配内存并删除它以释放它(这也是重要的C++不会知道什么时候释放它,这是开发者的工作 - C++是hardcore:D) 2.检查你分配正确的内存大小。我期望unicode是更大的内存(它编码更多的符号,有时使用大量的数字)。 3.如上所述从某处(终端或文件)读取,但在新文件中输出。之后,当你用文本编辑器打开文件时,确保你的编码设置为utf-8(你的文本编辑器必须知道如何解释数据)

我希望有帮助。

+0

在我的公司,我们还为所有UTF-8编码的东西使用boost :: locale。奇迹般有效。我强烈支持Teodor:使用现有的库。 –