UTF16(例如 Wide-winapi 函数使用的)字符是否始终为 2 字节长?

2024-01-25

请帮我解释一下,UTF16 是如何工作的? 考虑到以下几点,我有点困惑:

  • There is a static type in C++, WCHAR, which is 2 bytes long. (always 2 bytes long obvisouly) (UPDATE: as shown by the answers, this assumption was wrong).
  • 大多数 msdn 和其他一些文档似乎都假设字符始终为 2 个字节长。这可能只是我的想象,我无法举出任何具体的例子,但看起来就是这样。
  • C++ 或 Windows 中没有广泛使用的“超宽”函数或字符类型,因此我认为 UTF16 就是所需要的。
  • 据我不确定,unicode 的字符数比 65535 多得多,因此它们显然没有足够的 2 个字节空间。
  • UTF16 似乎是 UTF8 的更大版本,并且 UTF8 字符可以有不同的长度。

那么,如果 UTF16 字符并不总是 2 字节长,那么它还能长多长呢? 3字节?或者只是2的倍数? 然后,例如,如果有一个 winapi 函数想要知道一个宽字符串的字符大小,并且该字符串包含 2 个字符,每个字符长 4 个字节,那么该字符串的大小是多少在字符中计算过?

它是 2 个字符长还是 4 个字符长? (因为它是8个字节长,每个WCHAR是2个字节)

更新:现在我发现字符计数不一定是标准的东西,甚至也不一定是 C++ 的东西,所以我会尝试在第二个问题中更具体一些,关于宽字符串的“字符”长度:

在 Windows 上,特别是在 Winapi 中,在其宽函数(以 W 结尾)中,如何计算由 2 个 unicode 代码点组成的字符串中的字符数,每个代码点由 2 个代码单元(总共 8 个字节)组成?这样的字符串是 2 个字符长(与代码点数量相同)还是 4 个字符长(与代码单元总数相同?)

或者,更通用的是:“宽字符串中的字符数”的 Windows 定义是什么意思,代码点的数量或代码单元的数量?


简短回答:不。

的大小wchar_t——基本字符单位——是没有定义的根据 C++ 标准(参见第 3.9.1 节第 5 段)。实际上,在 Windows 平台上它是两个字节长,在 Linux/Mac 平台上它是四个字节长。

此外,字符以特定于字节序的格式存储。在 Windows 上,这通常意味着小端,但它也适用于wchar_t包含大端数据。

此外,尽管每个wchar_t是两个(或四个)字节长,一个单独的字形(大致是一个字符)可能需要多个wchar_ts,并且可能有不止一种方式来表示它。

一个常见的例子是角色é (LATIN SMALL LETTER E WITH ACUTE),代码点 0x00E9。这也可以表示为“分解”的代码点序列 0x0065 0x0301(即LATIN SMALL LETTER E其次是COMBINING ACUTE ACCENT)。两者均有效;请参阅维基百科文章Unicode 等效项 http://en.wikipedia.org/wiki/Unicode_equivalence了解更多信息。

简而言之,您需要知道或选择您将使用的编码。如果处理 Windows API,一个简单的选择是假设所有内容都是以 2 字节存储的小端 UTF-16wchar_ts.

在 Linux/Mac 上 UTF-8(带有chars) 更常见,API 通常采用 UTF-8。wchar_t被认为是浪费,因为它每个字符使用 4 个字节。

因此,对于跨平台编程,您可能希望在内部使用 UTF-8,并在调用 Windows API 时即时转换为 UTF-16。 Windows 提供了MultiByteToWideChar http://msdn.microsoft.com/en-us/library/dd319072.aspx and WideCharToMultiByte http://msdn.microsoft.com/en-us/library/dd374130.aspx函数来执行此操作,您还可以找到简化使用这些函数的包装器,例如ATL 和 MFC 字符串转换宏 http://msdn.microsoft.com/en-us/library/87zae4a3.aspx.

Update

该问题已更新为询问 Windows API 在询问字符串中的“字符数”时的含义。

如果 API 说“字符串的大小(以字符为单位)”,那么它们指的是字符串的数量wchar_ts(或数量chars 如果您由于某种原因在非 Unicode 模式下进行编译)。在那个具体案例您可以忽略这样一个事实:一个 Unicode 字符可能需要多个字符wchar_t。这些 API 只是想要填充缓冲区,并且需要知道它们有多少空间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UTF16(例如 Wide-winapi 函数使用的)字符是否始终为 2 字节长? 的相关文章

  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • html.AttributeEncode 与 html.Encode 有什么区别?

    html AttributeEncode 与 html Encode 有什么区别 属性编码 http msdn microsoft com en us library system web mvc htmlhelper attributee
  • 如何将 Java 结果集转换为 JSON?

    我有一个使用 JDBC 连接器进行 MySQL 查询的结果集 所以我的工作就是将结果集转换为 JSON 格式 这样我就可以将其作为 AJAX 响应发送到客户端 有人可以解释一下如何转换为 JSON 格式吗 因为我对 Java 和 JSON
  • 是否有一个事件可以检测屏幕何时变暗?

    我正在使用 SCREEN DIM WAKE LOCK 所以我的永远不会关闭 它只是从全亮变为暗淡 有什么方法可以让我检测屏幕何时变暗 事件 接收器等 据我从Android的源代码中看到 当屏幕亮度状态改变时 没有发送广播通知
  • 在 Svelte 中将多个参数传递给动态路由

    我正在尝试使用 Svelte 的第一个项目 我遇到了这样的情况 我从 API 中获取结果列表 如下所示 Page with a list of items each item
  • C++:最大整数[重复]

    这个问题在这里已经有答案了 是否有一个 C 跨平台库为我提供可移植的最大整数 我想声明 const int MAX NUM call some library here 我使用 MSVC 2008 非托管 在C 标准库头文件中
  • 无法在 ASP.Net vNext 项目中使用会话

    我有一个使用 Session 的 ASP Net vNext 项目 但是我在尝试在会话中获取 设置值时收到此错误 Microsoft AspNet Http Core dll 中发生 System InvalidOperationExcep
  • 将图像添加到 jar 中

    我想为我的 JFrame 设置图标 我执行以下操作 Image icon Toolkit getDefaultToolkit getImage src images icon jpg this setIconImage icon 当我从 n
  • 从 C 静态库中删除内部符号

    我正在研究一些作为静态库提供的嵌入式代码 我们希望从库中删除所有内部符号 只保留 API 符号可见 这是我们想要做的一个示例 假设您有一个名为internal c和一个叫api c看起来像这样 internal c int fibonacc
  • 检查文件是否存在 Objective-C

    我使用下面的代码来检查文件是否存在 bool b NSFileManager defaultManager fileExistsAtPath filePath 这些代码可以在 IOS 上运行 但是当我将它迁移到 mac os x 时 但我通
  • 是否有关于如何命名资源的约定?

    Android 中是否有命名资源的约定 例如 按钮 文本视图 菜单等 Android SDK 将是一个很好的起点 例如 我尝试在活动中确定 ID 的范围 如果我有一个ListView它只是 android id list在所有活动中 但是
  • 将 KeyFilter 与 ASP.NET Core 2.0 结合使用

    我在简单的 ASP NET Core 2 0 WebAPI 应用程序中使用 KeyFilter 属性时遇到问题
  • 使用 ffmpeg 分割成相等的部分并转换许多 mp4 视频

    我有大量视频需要使用 ffmpeg 将 mp4 转换为 wmv 并将每个文件分成 10 分钟的片段 但我是一个 cmd 脚本新手 事实上 我是一个脚本新手 在花了六个小时试图找到答案之后 我想我会把它带给你们 我的代码可以运行一点 但我需要
  • aurelia - 示例,安装依赖项时出错

    我一直在关注 Aurelia 网站上的示例以及以下示例 http aurelia io hub html doc article aurelia framework latest contact manager tutorial 2 htt
  • 使用图像作为 JPanel 和 JButton 的背景

    我正在尝试使用在 Photoshop 中制作的图像作为 GUI 的背景 我怎么做 我还制作了一些图像 我想在执行操作后在按钮背景中显示 对于 JButton 请使用以下命令 JButton button new JButton Button
  • 如何检测/处理弯曲区域上的触摸事件?

    我从一个本机 iPad 应用程序开始 如果需要 我们可以假设 iOS 4 3 我需要有一系列相互碰撞的弯曲区域 我希望得到一些有关处理此问题的最佳方法的建议 我的一个想法是使用 WebView 并且只有一个 JPG 和一个 HTML 图像映
  • rdf:Bag、rdf:Seq 和 rdf:Alt 在使用时有何不同?

    我正在读RDF 模式 1 1 http www w3 org TR rdf schema ch bag建议 其中包括以下内容 强调是后加的 5 1 2 rdf 袋子 http www w3 org TR rdf schema ch bag
  • 机器人可以到达点 (x, y) 吗?

    我在一次求职面试中遇到了这个问题 我无法找到解决方案的正确算法 所以我在这里发布这个问题 有一个机器人可以通过以下两种方式在坐标平面上移动 假设机器人当前位置为 x y 如果方向如下 则机器人可以移动等于 x 和 y 之和的距离 x y g
  • mp3 的

    首先这是我当前正在编码的网站 http www clairereviens com http www clairereviens com 每个按钮上都有一个 mp3 样本的标签 所有 mp3 在 Safari 中都能完美播放 但在 Chro
  • Jenkinsfile windows cmd输出变量参考

    我对 groovy 还很陌生 在我的Jenkinsfile我试图将 Windows cmd 输出存储在变量中 在下一个命令中使用它 但似乎没有任何效果 这是我得到的最接近的 pipeline agent any stages stage p
  • UTF16(例如 Wide-winapi 函数使用的)字符是否始终为 2 字节长?

    请帮我解释一下 UTF16 是如何工作的 考虑到以下几点 我有点困惑 There is a static type in C WCHAR which is 2 bytes long always 2 bytes long obvisouly