草庐IT

c++ - C++ 标准是否要求对 wchar_t 进行编码?

coder 2024-02-07 原文

以下是我的 2014 草案标准 N4140 的一些摘录

22.5 Standard code conversion facets [locale.stdcvt]

3 For each of the three code conversion facets codecvt_utf8, codecvt_utf16, and codecvt_utf8_utf16:
(3.1) — Elem is the wide-character type, such as wchar_t, char16_t, or char32_t.

4 For the facet codecvt_utf8:
(4.1) — The facet shall convert between UTF-8 multibyte sequences and UCS2 or UCS4 (depending on the size of Elem) within the program.

这两段的一种解释是wchar_t必须编码为 UCS2 或 UCS4。我不太喜欢它,因为如果它是真的,我们就有了一个重要的语言属性,它深藏在库描述中。我试图找到更直接的关于此属性的声明,但无济于事。

另一种解释是wchar_t编码不需要是 UCS2 或 UCS4,在不需要的实现上,codecvt_utf8不适用于 wchar_t .我也不太喜欢这种解释,因为如果它是真的,char 都不是。也不wchar_t native 编码是 Unicode,似乎没有一种方法可以在这些 native 编码和 Unicode 之间进行可移植的转换。

这两种解释中哪一种是正确的?还有一个我忽略了吗?

澄清 我不是在询问关于 wchar_t 的适用性的一般意见用于软件开发,或 wchar_t 的属性一个人可以从别处得到。我对标准的这两个特定段落感兴趣。我试图了解这些特定段落包含或不包含的内容。

澄清 2。如果 4.1 说“该方面应在 UTF-8 多字节序列和 UCS2 或 UCS4 或当前全局区域设置对 wchar_t 强加的任何编码之间进行转换”,那将没有问题。它没有。它说它说的。看来,如果一个人使用 std::codecvt_utf8<wchar_t> , 最后得到一堆 wchar_t编码为 UCS2 或 UCS4,无论当前的全局语言环境如何。 (无法为 codecvt_utf8 指定语言环境或任何字符转换方面)。所以这个问题可以这样改写:转换结果是否可直接用于当前全局语言环境(和/或任何可能的语言环境)以输出,wctype查询等等?如果不是,它有什么用? (如果上面的第二种解释是正确的,答案似乎是“无”)。

最佳答案

wchar_t 只是一个完整的文字。它有一个最小值,一个最大值等。

它的大小不是由标准固定的。

如果足够大,可以将UCS-2 或UCS-4 数据存储在wchar_t 的缓冲区中。无论您使用何种系统,这都是事实,因为 UCS-2 和 UCS-4 以及 UTF-16 和 UTF-32 只是对按序列排列的整数值的描述。

在 C++11 中,有 std API 可以读取或写入假定数据具有这些编码的数据。在 C++03 中,有使用当前语言环境读取或写入数据的 API。

22.5 Standard code conversion facets [locale.stdcvt]

3 For each of the three code conversion facets codecvt_utf8, codecvt_utf16, and codecvt_utf8_utf16:

(3.1) — Elem is the wide-character type, such as wchar_t, char16_t, or char32_t.

4 For the facet codecvt_utf8:

(4.1) — The facet shall convert between UTF-8 multibyte sequences and UCS2 or UCS4 (depending on the size of Elem) within the program.

所以这里 codecvt_utf8_utf16 一方面处理 utf8,另一方面处理 UCS2 或 UCS4(取决于 Elem 的大小)。它进行转换。

Elem(宽字符)被假定为使用 UCS2 或 UCS4 编码,具体取决于它的大小。

这并不意味着 wchar_t 是这样编码的,它只是意味着此操作将 wchar_t 解释为这样编码

UCS2 或 UCS4 如何进入 Elem 不是标准的这一部分关心的内容。也许你用十六进制常量将它设置在那里。也许你是从 io.也许你是即时计算的。也许您使用了高质量的随机数生成器。也许您将 ascii 字符串的位值加在一起。也许您计算了月球将地球日改变 1 秒所需秒数的 log* 的定点近似值。 不是这些段落的问题。这些段落只是规定如何修改和解释位。

类似的说法在其他情况下也成立。这并不强制要求 wchar_t 有什么格式。它只是说明了这些方面如何解释 wchar_tchar16_tchar32_tchar8_t(读或写)。

wchar_t 交互的其他方式使用不同的方法来强制解释 wchar_t 的值。

iswalpha例如,使用(全局)语言环境来解释 wchar_t。在某些本地人中,wchar_t 可能是 UCS2。在其他情况下,它可能是一些疯狂的 cthulian 编码,其细节使您能够从太空中看到一种新颜色。

明确地说:编码不是数据或位的属性。编码是数据解释 的属性。通常只有一种正确合理的数据解释有意义,但数据本身就是比特。

C++ 标准不强制要求在 wchar_t 中存储什么。它确实规定了某些操作将 wchar_t 的内容解释为什么。该部分描述了某些方面如何解释 wchar_t 中的数据。

关于c++ - C++ 标准是否要求对 wchar_t 进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38770680/

有关c++ - C++ 标准是否要求对 wchar_t 进行编码?的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  4. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  5. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  6. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  7. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  8. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  9. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  10. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

随机推荐