- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 ¹comp.lang.c++ Usenet 组中,我最近断言,基于我所知道的,Windows 的 16 位 wchar_t
,使用 UTF-16 编码,其中有时有两个这样的值(称为“代理对”)对于单个 Unicode 代码点是必需的,对于表示 Unicode 是无效的。
虽然 Unicode 联盟 2004 年的技术说明 12 为使用用于内部处理的 UTF-16,以及一系列令人印象深刻的软件。
显然,最初的意图似乎是每个代码点有一个wchar_t
值,这与C 和C++ 标准库的假设一致。例如。在 ³unix.org 的网页“ISO C 修正案 1 (MSE)”中,关于在 1995 年将 wchar_t
纳入 C 标准的修正案,作者认为
” The primary advantage to the one byte/one character model is that it is very easy to process data in fixed-width chunks. For this reason, the concept of the wide character was invented. A wide character is an abstract data type large enough to contain the largest character that is supported on a particular platform.
但事实证明,C 和 C++ 标准似乎并没有讨论支持的最大字符,而只讨论了支持的语言环境中最大的扩展字符集 : wchar_t
必须足够大以表示最大的此类扩展字符集中的每个代码点——但不是 Unicode,当没有 Unicode 语言环境时。
” [the
wchar_t
type] is an integer type whose range of values can represent distinct codes for all members of the largest extended character set specified among the supported locales.
这几乎与 C++ 标准中的措辞相同。这似乎意味着,在受支持的区域设置受限的情况下,wchar_t
确实可以很小,使用 UTF-8 编码可以降低到单个字节(这是一种噩梦,例如没有标准库字符分类函数会在 ASCII 的 A 到 Z 之外工作,但是嘿)。可能以下是比这更宽的要求:
” A wide character is a code value (a binary encoded integer) of an object of type
wchar_t
that corresponds to a member of the extended character set.
... 因为它指的是 扩展字符集,但该术语似乎没有在任何地方进一步定义。
至少对于 Microsoft 的 C 和 C++ 运行时,没有 Unicode 语言环境:使用该实现 setlocale
仅限于每个字符最多 2 个字节的字符编码:
setlocale
的文档:
” The set of available locale names, languages, country/region codes, and code pages includes all those supported by the Windows NLS API except code pages that require more than two bytes per character, such as UTF-7 and UTF-8. If you provide a code page value of UTF-7 or UTF-8,
setlocale
will fail, returningNULL
.
所以看来,与我所知道的相反,也与我的断言相反,Windows 的 16 位 wchar_t
在形式上是可以的。主要是由于 Microsoft 巧妙地缺乏对 UTF-8 语言环境或每个字符超过 2 个字节的任何语言环境的支持。但是真的是这样吗,16位的wchar_t
可以吗?
<支持>链接:
¹ 新闻:comp.lang.c++
² http://unicode.org/notes/tn12/#Software_16
³ http://www.unix.org/version2/whatsnew/login_mse.html
⁴ https://msdn.microsoft.com/en-us/library/x99tb11d.aspx
最佳答案
wchar_t
现在不是,也从来不是 Unicode 字符/代码点。 C++ 标准并未声明宽字符串文字将包含 Unicode 字符。 C++ 标准并未声明宽字 rune 字将包含 Unicode 字符。事实上,该标准没有说明 任何 wchar_t
将包含的内容。
wchar_t
可以与可识别区域设置的 API 一起使用,但它们仅与实现定义的编码相关,而不是任何特定的 Unicode 编码。采用这些的标准库函数使用它们对实现编码的了解来完成它们的工作。
那么,16 位的wchar_t
合法吗?是的;该标准不要求 wchar_t
足够大以容纳 Unicode 代码点。
wchar_t
的字符串是否允许保存 UTF-16 值(或一般的可变宽度)?好吧,您可以制作 wchar_t
字符串来存储您想要的任何内容(只要它适合)。因此,就标准而言,问题是是否允许标准提供的用于生成 wchar_t
字符和字符串的方法使用 UTF-16。
好吧,标准库可以为所欲为;该标准不保证从任何特定字符编码到 wchar_t
的转换将是 1:1 映射。即使是通过 wstring_convert
进行的 char
->wchar_t
转换也不需要标准中的任何地方来生成 1:1 字符映射。
如果编译器希望声明宽字符集由 Unicode 的基本多语言平面组成,那么像这样的声明 L'\U0001F000'
将生成单个 wchar_t
。但是这个值是实现定义的,根据 [lex.ccon]/2:
The value of a wide-character literal containing a single c-char has value equal to the numerical value of the encoding of the c-char in the execution wide-character set, unless the c-char has no representation in the execution wide-character set, in which case the value is implementation-defined.
当然,C++ 不允许将代理项对用作c-char; \uD800
是一个编译错误。
标准中变得模糊的地方是如何处理包含字符集之外的字符的字符串。上面的文字表明实现可以做他们想做的事。然而,[lex.string]\16 是这样说的:
The size of a
char32_t
or wide string literal is the total number of escape sequences, universal-character-names, and other characters, plus one for the terminating U’\0’ or L’\0’.
我说这很模糊,因为没有说明如果字符串文字中的 c-char 超出目标字符集的范围时应该采取什么行为。
Windows 编译器(VS 和 GCC-on-Windows)确实会导致 L"\U0001F000"
的数组大小为 3(两个代理项对和一个 NUL 终止符)。这是合法的 C++ 标准行为吗?为超出字符集有效范围的字符串文字提供 c-char 是什么意思?
我会说这是标准中的漏洞,而不是那些编译器中的缺陷。它应该更清楚这种情况下的转换行为应该是什么。
无论如何,wchar_t
都不是处理 Unicode 编码文本的合适工具。它对于表示 任何形式 的 Unicode 不是“正式有效的”。是的,许多编译器将宽字符串文字实现为 Unicode 编码。但由于标准不要求这样做,您不能依赖它。
很明显,您可以将任何适合 wchar_t
的内容粘贴进去。因此,即使在 wchar_t
为 32 位的平台上,您也可以将 UTF-16 数据推送到其中,每个 16 位字占用 32 位。但是您不能将此类文本传递给任何需要宽字符编码的 API 函数,除非您知道这是该平台的预期编码。
如果您想使用 Unicode 编码,基本上不要使用 wchar_t
。
关于c++ - 16 位 wchar_t 是否正式代表完整的 Unicode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39548465/
我正在尝试在我的 UITableView 上调用 reloadData。我在没有界面生成器的情况下制作我的应用程序。 此代码适用于 Interface Builder,但似乎没有。 当我将我的代码与我
有人可以解释 UIAlertView 的委托(delegate)是如何工作的吗?它是自动调用还是我必须调用它?例如: - (void)alertView:(UIAlertView *)alertVie
编辑:好吧,根据其他人的建议,我创建了一个最小的示例......并且它有效,因此我将在未来与任何人分享它。这是工作代码: #include #include using namespace std
unicode 是 ,它被用在 XML 文档中。 最佳答案 查看图表:unicodelookup.com 换行符。 关于html - unicode字符是什么 代表?,我们在Stack Overflo
我有一个应用程序,可以以编程方式在配置的 Facebook 页面上发帖。我的应用程序显然已批准管理页面和发布页面权限,并且我正在使用页面访问 token 从现在开始一切正常,但最近当我在页面提要上发布
代表 NCAA 男子篮球分组的最佳数据库模式是什么?如果您不熟悉,请点击以下链接:http://www.cbssports.com/collegebasketball/mayhem/brackets/
所以我一直在阅读这个关于如何使用 Frida 的教程:https://www.frida.re/docs/functions/我遇到过以下情况: $ ./client 127.0.0.1 connec
委托(delegate)函数返回之前是否需要调用replyHandler?我需要进行几次 Web 服务 API 调用才能回复,以下实现正确吗? func session(_ session: WCSe
下面提到的是我的 textField 委托(delegate)方法,我正在使用 IQKeyBoardSwift 作为智能键盘。我尝试移除我的键盘,但我仍然没有收到任何关于接受“开始触摸”的方法的调用
我有一个表格 View ,其中几乎没有用于数据输入的文本字段和弹出窗口。我想将其中一些表示为强制性的。我不知道如何讨厌星号。任何帮助将不胜感激。 最佳答案 我认为你可以使用自定义 UITableVie
例如,我知道如何使用 numpy 对数组进行切片 v[1, :, :] 现在我想要一个函数将切片 (1,1,None) 作为输入并返回 v[1,:,:] 问题是我不知道如何表示省略号 最佳答案 您可以
修订... 应用程序的关键是与数据库服务器通信。服务器对应用程序的响应都是 XML 格式的。有几个屏幕。例如,屏幕 1 列出了用户的信息,屏幕 2 列出了用户过去的交易,允许新交易,等等。 这是我的
我想知道映射/表示内存的最佳方式是什么。我的意思是,例如,如何描述一个结构及其所有字段都被序列化。 我正在创建一个 RPC 库,它将使用 dwarf 调试数据创建客户端和服务器,因此我需要创建一个函数
如果我有一个实现了两个协议(protocol)的 View Controller : @interface CustomerOperationsViewController : UIViewContr
在 Objective-C 中我可以做这样的事情: @property (nonatomic, weak) id someObject; 如何在swift中做到这一点?我试过这个: let someO
我成功地使用了相当棒的 connection:didReceiveAuthenticationChallenge: NSURLConnectionDelegate 委托(delegate)方法。很酷。
我正在寻找原始数据类型的 @NonNull 等效 Java 注释。我知道原始数据不能为 null,但我找不到替代方法。 我想要实现的在逻辑上等同于: int mPageNumber; public v
我正在学习 Git,如果我能描述代表 Git 存储库的数学结构,那就太好了。例如:它是一个有向无环图;它的节点代表提交;它的节点有代表分支等的标签(每个节点最多一个标签,没有标签使用两次)。(我知道这
我看过很多与委托(delegate)相关的帖子,我想知道引用它们的正确方法。假设我有一个声明如下的对象: @interface MyViewController : UITableViewContro
我有这个类: public class Order { int OrderId {get; set;} string CustomerName {get; set;} } 我也声明下面的变
我是一名优秀的程序员,十分优秀!