【问题标题】:ISO-8859 to UTF-8 Conversion C++ISO-8859 到 UTF-8 转换 C++
【发布时间】:2012-12-22 10:48:41
【问题描述】:

我一直在尝试使用以下代码将 ISO-8859 字符集转换为 utf-8: Convert ISO-8859-1 strings to UTF-8 in C/C++ 这是我的代码:

#include <iostream>
#include <string>

using namespace std;
int main(int argc,char* argv[])
{
    string fileName ="ħëlö";
    int len= fileName.length();
    char* in = new char[len+1];
    char* out = new char[2*(len+1)];
    memset(in,'\0',len+1);
    memset(out,'\0',len+1);
    memcpy(in,fileName.c_str(),2*(len+1));


    while( *in )
    {
            cout << " ::: " << in ;
            if( *in <128 )
            {
                    *out++ = *in++;
            }
            else
            {
                    *out++ = 0xc2+(*in>0xbf);
                    *out++ = (*in++&0x3f)+0x80;
            }
    }
    cout << "\n\n out ::: " << out << "\n";
    *out = '\0';
}

但是输出是

::: ħëlö ::: ?ëlö ::: ëlö ::: ?lö ::: lö ::: ö ::: ?

 out :::   

输出 'out' 应该是一个 utf-8 字符串,但它不是。我在 Mac OS X 中得到了这个..

我在这里做错了什么..?

【问题讨论】:

  • (1) 缺少 #include。 (2) 你期望的输出是什么?请说清楚。 (3)和osx(tag)有什么关系?顺便说一句:用 gcc 4.7.2 确认了 linux 上的行为
  • 我不确定 std::cout 是否能很好地处理您的 UTF-8 编码字符串。这可能是问题所在,而不是转换代码。
  • 修复@unwind 回答中的指针问题后,确保您的shell 设置为UTF-8:stackoverflow.com/questions/4606570/os-x-terminal-utf-8-issues
  • 您可能应该使用unsigned char 而不仅仅是char,因为您需要处理高于128 的值。

标签: c++ utf-8 character-encoding


【解决方案1】:

ISO-8859-1 没有字符 ħ,因此您的源不可能按照方法要求在 ISO-8859-1 中。或者您的源代码是 ISO-8859-1,但是一旦保存,ħ 将被替换为 ?

【讨论】:

    【解决方案2】:

    您正在增加循环中的out 指针,导致您无法跟踪输出的开始位置。传递给cout 的指针是递增的,因此它显然不再指向生成输出的开头。

    此外,out 的终止发生在 打印之后,这当然是错误的方法。

    另外,这依赖于源代码和东西的编码,不是很好。您应该以不同的方式表达输入字符串,使用具有十六进制值的单个字符或出于安全考虑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-21
      • 2016-07-18
      • 2012-06-30
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多