c++:如何在utf8中支持代理字符

c++:如何在utf8中支持代理字符,c++,utf-8,internationalization,utf-16,surrogate-pairs,C++,Utf 8,Internationalization,Utf 16,Surrogate Pairs,我们有一个以utf-8基本编码编写的应用程序,它支持utf-8 BMP 3字节。但是,在需要支持代理项对的情况下,有一个需求 我在某个地方读到utf-8不支持代理字符。这是真的吗 如果是,有哪些步骤使我的应用程序具有默认的utf-16编码而不是utf-8编码 我没有代码片段,因为整个应用程序都是通过记住utf-8而不是代理字符编写的 为了获得utf-8中代理项对的支持,我需要在整个代码中更改哪些项。或者将默认编码更改为UTF-16 我们有一个以utf-8基本编码编写的应用程序,它支持utf-8

我们有一个以utf-8基本编码编写的应用程序,它支持utf-8 BMP 3字节。但是,在需要支持代理项对的情况下,有一个需求

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

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

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

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

我们有一个以utf-8基本编码编写的应用程序,它支持utf-8 BMP 3字节。但是,在需要支持代理项对的情况下,有一个需求

因此,将utf-16编码字符串转换为utf-8。此处的文档:

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

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

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

见上文。将入站数据的UTF-16转换为UTF-8,必要时将其转换回UTF-16出站

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

为什么不将整个Unicode指令集设置为4字节?为什么仅限于3个字节?3字节仅支持U+FFFF以下的代码点。4字节支持额外的1048576个代码点,一直到U+10FFFF

但是,在需要支持代理项对的情况下,有一个需求

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

我在某个地方读到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或从UTF-8转换数据时只处理UCS-2。只需更新该代码以支持UTF-16而不是UCS-2,就可以了。

代理项对是一种编码不在BMP上且太大而无法存储在UTF-16中的代码点的方法。UTF-8可以简单地存储这些代码点,我敢肯定,任何将UTF-16代理项对在UTF-8中双编码为两个代码点的工具都会将这种情况视为一个错误。@ChrisBecke:这是一个答案,不是注释。哦,除了它太大而无法存储在UTC-2中之外,UTF-16是在使用16位基本块和代理项对的情况下存储高达1000000以上的值的方法。请注意,UTF-16还需要使用代理项对。你需要使用UTF-32来避免它们。@MartinBonner:哦,除了它太大而无法存储在UCS-2中之外,对于在Windows上运行或用Java编写的新应用程序,我会在内部使用UTF-16,因为它是这些平台上的本机应用程序。对于*nix、MacOs和跨平台,我将使用UTF-8。我很确定Android必须在本地使用UTF-16,而iOS必须在内部使用UTF-8。除了跨平台应用之外,我总是使用原生Unicode格式。对于现有的应用程序,请坚持使用现有的应用程序;对于OP yes,请坚持使用UTF-8。但是,这可能不适用于任何前来阅读本QA的人。