0

这是我试图将接收到的文件路径编码为 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 作为解决方案将 ISO-8859-1 字符串转换为 C/C++ 中的 UTF-8,看起来它可以工作。[答案被接受]。所以我想我一定是犯了一些错误,但我无法确定它是什么。有人可以帮我解决这个问题,拜托。

我首先在 Codereview 中发布了这个问题,但我没有得到任何答案。很抱歉重复。

4

2 回答 2

1

您使用任何平台还是在标准之上构建它?我相信很多人都使用这种转换,因此有图书馆。我强烈建议您使用libraray,因为该库已经过测试,并且通常使用最好的方法。

我发现这样做的一个库是 boost locale

这是标准的。如果您使用 QT,我建议您为此使用 QT 转换库(它与平台无关)

QT

如果您想自己做(您想看看它是如何工作的或出于任何其他原因) 1. 确保分配内存!-这在 C,C++ 中非常重要。由于您使用 iostream 使用 new 来分配内存并使用 delete 来释放它(这也很重要 C++ 不会确定何时释放它。这是开发人员的工作 - C++ 是核心 :D) 2. 检查您是否分配合适的内存大小。我希望 unicode 是更大的内存(它编码更多的符号,有时使用大数字)。3. 如上所述,从某处(终端或文件)读取,但在新文件中输出。之后,当您使用文本编辑器打开文件时,请确保将编码设置为 utf-8(您的文本编辑器必须知道如何解释数据)

我希望这会有所帮助。

于 2013-01-12T10:29:24.373 回答
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 可能已经是无符号的,但这取决于编译。

于 2013-01-12T10:10:38.530 回答