0

我们有一个使用 utf-8 基本编码编写的应用程序,它支持 utf-8 BMP(3 字节)。但是,它需要支持代理对。

我在某处读到 utf-8 不支持代理字符。这是真的吗?

如果是,使我的应用程序具有默认编码 utf-16 而不是 utf-8 的步骤是什么?

我没有代码片段,因为整个应用程序都是通过记住 utf-8 而不是代理字符来编写的。

我需要在整个代码中更改哪些项目才能获得 utf-8 中代理对的支持。或者将默认编码更改为 UTF-16。

4

2 回答 2

6

我们有一个使用 utf-8 基本编码编写的应用程序,它支持 utf-8 BMP(3 字节)。

为什么不是整个 Unicode 曲目(4 个字节)?为什么仅限于 3 个字节?3 个字节让您只支持最多 U+FFFF 的代码点。4 个字节让您支持额外的 1048576 个代码点,一直到 U+10FFFF。

但是,它需要支持代理对。

代理对仅适用于 UTF-16,不适用于 UTF-8 甚至 UCS-2(UTF-16 的前身)。

我在某处读到 utf-8 不支持代理字符。这是真的吗?

用于编码代理的代码点可以物理编码为 UTF-8,但是它们由 Unicode 标准保留,并且在 UTF-16 编码之外使用是非法的。UTF-8 不需要代理对,任何包含代理代码点的解码 Unicode 字符串都应被视为格式错误。

如果是,使我的应用程序具有默认编码 utf-16 而不是 utf-8 的步骤是什么?

我们无法回答这个问题,因为您没有提供有关如何设置项目、使用的编译器等的任何信息。

但是,您不需要将应用程序切换到 UTF-16。您只需更新您的代码以支持 UTF-8 的 4 字节编码,并确保在将 16 位数据转换为 UTF-8 时支持代理对。不要将自己限制为 U+FFFF 作为最高可能的代码点。Unicode 的代码点比这多得多。

听起来您的代码仅在将数据转换为/从 UTF-8 时处理 UCS-2。只需更新该代码以支持 UTF-16 而不是 UCS-2,就可以了。

于 2017-03-08T23:08:04.650 回答
3

我们有一个使用 utf-8 基本编码编写的应用程序,它支持 utf-8 BMP(3 字节)。但是,它需要支持代理对。

因此将 utf-16 编码的字符串转换为 utf-8。此处的文档:http ://www.cplusplus.com/reference/codecvt/codecvt_utf8_utf16/

如果是,使我的应用程序具有默认编码 utf-16 而不是 utf-8 的步骤是什么?

错误的问题。在内部使用 UTF-8。

我需要在整个代码中更改哪些项目才能获得 utf-8 中代理对的支持。或者将默认编码更改为 UTF-16。

看上面。将入站数据的 UTF-16 转换为 UTF-8,并在必要时转换回 UTF-16 出站数据。

于 2017-03-02T13:32:04.813 回答