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 は、C/C++で ISO-8859-1 文字列を UTF-8 に変換するソリューションとして提供されています。だから私は間違いを犯しているに違いないと思いますが、それが何であるかを特定することはできません. 誰かがこれで私を助けてくれますか、お願いします。

この質問を最初に Codereview に投稿しましたが、回答が得られません。重複して申し訳ありません。

4

2 に答える 2

1

プラットフォームを使用していますか、それとも std の上に構築していますか? 多くの人がそのような変換を使用していると確信しているため、ライブラリがあります。ライブラリはテストされており、通常は最善の方法が使用されるため、libraray を使用することを強くお勧めします。

これを行っていることがわかったライブラリは boost localeです

これは標準です。QT を使用する場合は、QT 変換ライブラリを使用することをお勧めします (プラットフォームに依存しません)。

QT

自分でやりたい場合 (どのように動作するかを確認したい場合やその他の理由で) 1. メモリを割り当てていることを確認してください。-これは C、C++ では非常に重要です。iostream を使用して new を使用してメモリを割り当て、delete を使用して解放します (これも重要です。C++ はいつ解放するかを判断しません。これは開発者の仕事です - C++ はハードコアです:D) 2. 割り当てていることを確認します。メモリの適切なサイズ。ユニコードはより大きなメモリになると思います(より多くのシンボルをエンコードし、時には大きな数を使用します). 3. すでに述べたように、どこか (端末またはファイル) から読み取りますが、新しいファイルに出力します。その後、テキスト エディターでファイルを開くときは、エンコーディングが utf-8 に設定されていることを確認してください (テキスト エディターはデータの解釈方法を認識している必要があります)。

それが役立つことを願っています。

于 2013-01-12T10:29:24.373 に答える
0

最初に、元の Latin-1 文字列を特定のエンコーディング (おそらく Latin-1) を期待する端末に出力しています。次に、UTF-8 にトランスコードし、それを同じ端末に出力すると、異なる解釈が行われます。古典的なもじばけ。代わりに、出力で次のことを試してください。

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

2 つのキャストは、最初に unsigned バイト値を取得し、次に unsigned 値を取得して、ストリームがそれを char として扱わないようにすることに注意してください。char はすでに署名されていない可能性がありますが、それはコンパイルに依存することに注意してください。

于 2013-01-12T10:10:38.530 に答える