【问题标题】:How to show special Chinese, Korean, Japanese characters without errors如何正确显示特殊的中文、韩文、日文字符
【发布时间】:2019-02-28 05:06:26
【问题描述】:

我在显示中文、韩文、日文字符时遇到问题。 我正在使用 ID3Tag lib C++ 来获取一些 mp3 文件的元数据。但是,有些文件名是韩文字符,它显示错误的标题名称。 例如:

id3_utf16_t *tmp = id3_ucs4_utf16duplicate(id3_field_getstrings(f,0));
if (NULL != tmp)
{
     str.append(QString::fromUtf16(tmp));
     LOG << str;
}

str的输出为:"³ª·Î ¸»ÇÒ °Í °°À¸¸é" 但实际上,标题名称是:"나로 말할 것 같으면"

那么如何正确显示特殊字符呢?

谢谢

【问题讨论】:

  • 您使用的是哪个操作系统?
  • 不保证 ID3 标签实际上是 Unicode 兼容的。你能显示 tmp 的十六进制转储吗?
  • 我使用的是 Ubuntu 15.04
  • tmp 的十六进制转储:b3 aa b7 ce
  • 这看起来一点也不像您展示的韩文字符串。你怎么知道是这个字符串?

标签: c++ qt


【解决方案1】:

使用 website 我将您粘贴的输出转换为十六进制。然后将其转换为 UTF-16LE。在那之后它们是韩文字符,但不完全是您发布的字符。我认为韩语有一种组合字符的方法,这可能不是这样。

编辑删除错误答案

【讨论】:

  • 这部分不是答案,部分是错误答案。
  • 抱歉,我认为我没有足够的声誉来评论这篇文章,所以我不知道还有什么方法可以澄清这个问题。如果这被认为是错误的形式,我可以将其删除。
  • LOG 的更多细节:#define LOG qDebug()
  • 使用这个website 我把你粘贴的输出转换成十六进制。然后将其转换为 UTF-16LE。在那之后它们是韩文字符,但不完全是您发布的字符。我认为韩语有一种组合字符的方法,这可能不是这样。
  • 它似乎是小端。您需要查找从该格式解码的函数。
【解决方案2】:

如果解释为 EUC-KR 字符串,则输出是正确的。

# echo "³ª·Î ¸»ÇÒ °Í °°À¸¸é" | iconv -f utf8 -t latin1 | iconv -f EUC-KR -t utf8
나로 말할 것 같으면

Live demo

所以我对正在发生的事情的有根据的猜测如下:

  1. 日志文件被编码为 EUC-KR(2 字节编码)。
  2. 您正在使用认为它是 Latin-1(1 字节编码)的工具(编辑器、终端等)查看它。
  3. 为什么日志文件编码为 EUC-KR?因为tmp 实际上不在 UTF-16 中,而是在 EUC-KR 中。

    # printf '\xb3\xaa\xb7\xce' | iconv -f EUC-KR -t utf-8
    나로
    

    QString 无法使用fromUtf16 正确转换这些字节。

  4. 为什么tmp 在 EUC-KR 中?我不知道。可能文本字段中的编码未设置,或者设置不正确,因此您的库不知道如何解释它。

【讨论】:

  • 非常感谢您的有用回答。我做的。但是,有一个新问题,如何从字符串中检测编码。它与stackoverflow.com/questions/9103294/… 相关。我正在阅读它并尝试再次感谢
  • @Huong 一般来说你无法检测编码,你只能猜测它或多或少的不确定性。
  • 谢谢。我可以请你帮个忙吗?请向我推荐一个网络或示例代码以获得高编码概率。我坚持下去。谢谢
猜你喜欢
  • 2011-04-08
  • 2015-09-12
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多