【问题标题】:Convertion from extended ascii to utf8从扩展 ascii 转换为 utf8
【发布时间】:2010-09-09 16:17:43
【问题描述】:

如何使用 microsoft visual studio 2005 将扩展 ascii 编码的 std::string 转换为 utf8?

我正在使用 google 协议缓冲区,如果我在没有转换的情况下给出它,它会抱怨我的字符串中包含非 utf8 字符,这是真的......

【问题讨论】:

  • “扩展 ASCII”是什么意思?
  • 没有“扩展ASCII”之类的东西。您首先需要找出编码(如 ISO 8859-1 aka Latin-1 或一些 Windows 代码页)。
  • en.wikipedia.org/wiki/Extended_ASCII 我想我说的是 ISO-8859-1
  • 字符串从何而来?您应该定义进行字符转换的边界。在内部,所有字符串都应该是某种格式(似乎您需要 UTF-8),因此您的代码的任何输入也应该是 UTF-8(或由输入法自动转换)。所以问题是未经处理的字符串是从哪里来的?

标签: c++ utf-8 protocol-buffers extended-ascii


【解决方案1】:

使用MultiByteToWideChar 将您的字符串转换为UTF-16,然后使用WideCharToMultiByte 将其转换为UTF-8。

【讨论】:

  • @Andrey:上次我调查这个问题时(我承认这是很久以前的事了),我发现除了通过 UTF-16 的路由之外别无他法。
  • 代码 > 127 的 ASCII 字符在 UTF-8 方面无效。 MultiByte 代表 UTF-8。这行不通,我告诉你,试试吧。可能是你(或我 :))误解了这个问题。
  • @Andrey:MultiByteToWideChar() 还可以将系统编码的文本转换为 UTF-16。这就是我们误解的根源吗? TTBOMK,这就是 Win32 API 提供的用于在系统编码和 UTF-8 之间转换的所有内容。
  • @Andrey, MultiByteToWideChar 可以从 许多 代码页转换,而不仅仅是 UTF-8。这就是它的第一个参数所表示的。
  • @sbi 你是对的,如果你将 1252 作为代码页传递,这将起作用,但我仍然喜欢我的方法,它更快:)
【解决方案2】:

让我们假设神秘的扩展 ASCII 只是 Latin1。然后使用维基百科的掩码:

110y yyxx 10xx xxxx

既然你只有 00..FF 那么你有:1100 00xx 10xx xxxx.

转换算法如下,如果字符代码 127 则您将 0xC0 | ((x & 0xC0) >> 24) 转到第一个字节,第二个是 ((x & 0x3F) | 0x80)

【讨论】:

  • 你在说什么“来自维基百科的面具”?您也没有生成有效的 UTF-8; UTF-8 中没有任何零字节。
猜你喜欢
  • 2011-05-20
  • 2015-06-04
  • 2018-05-01
  • 2023-03-31
  • 2013-03-19
  • 1970-01-01
  • 2010-10-14
  • 2018-11-23
  • 1970-01-01
相关资源
最近更新 更多