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 字节长? 的相关文章

  • 到底什么是“位填充”或“填充位”?

    我只是在互联网上找不到任何关于 位填充 真正含义的详细解释 并且在 Stack Overflow 上也没有找到与位填充相关的线程的任何答案 我还搜索了 ISO 9899 1990 其中提到了 位填充 但没有根据我的需要进行解释 我在网上找到
  • ASP .NET MVC 5 - 客户地址一对一关系

    我在这里查看了论坛 实际上发现了一些类似的问题 但不是相同的问题 类似的解决方案没有给我正确的答案 我正在使用实体框架和代码优先方法来处理 ASP NET MVC 5 我想建立客户 gt 地址一对一关系的模型 我建模的是 客户等级 publ
  • 获取光标相对于控件的位置 - C#

    我想获取鼠标相对于鼠标指针所在控件的位置 这意味着当我将光标置于控件的起点 左上角 时 它应该给出 0 0 我正在使用以下代码 private void panel1 MouseMove object sender MouseEventAr
  • C# 动态 Linq 变量Where 子句

    我正在按照 Scott Gu 的文章创建动态 LINQhttp weblogs asp net scottgu archive 2008 01 07 dynamic linq part 1 using the linq dynamic qu
  • EASTL 与 STL 相比,std::vector::operator[] 怎么会有这么大的性能差异

    根据http www open std org jtc1 sc22 wg21 docs papers 2007 n2271 html http www open std org jtc1 sc22 wg21 docs papers 2007
  • DLL 需要访问其应用程序的符号

    在 C 中 DLL 是否可以访问加载它的应用程序的某些符号 我有一个加载插件 dll 的应用程序 这些插件需要访问该应用程序的某些API 是否可以在不创建共享此 API 的新 DLL 的情况下实现此目的 函数指针结构适合这种情况吗 示例 主
  • 如何使用 ASP.NET MVC 4.0 DonutOutputCache VaryByCustom 使缓存失效

    我正在为我的 ASP NET 应用程序使用 DevTrends MvcDonutCaching 包 它工作得很好 我目前遇到的一个问题是使我为子操作设置的 VaryByCustom 缓存无效 这是我用于 VaryByCustom 设置的一些
  • 如何在单独的类库中管理客户端上下文对象?

    我正在尝试创建一个库 类库 对于共享点 它将拥有所有共享点 dll 来与共享点服务器交互上传文件 文档并创建文档库和文档集 现在这个库可以被使用客户端 例如 Web 应用程序 asp net webform 或 mvc 或控制台应用程序或
  • 为什么long long 2147483647 + 1 = -2147483648? [复制]

    这个问题在这里已经有答案了 为什么这段代码不打印相同的数字 long long a b a 2147483647 1 b 2147483648 printf lld n a printf lld n b 我知道int变量的最大数量是2147
  • 当应用程序未聚焦时监听按键

    我有一个应用程序 C 4 0 WPF 它是隐藏的 可以通过单击系统托盘图标或我创建的其他框架 停靠在左侧和最上面的小框架 来显示 My customer wants to add a new way to display the appli
  • 从 Linq 的列表中选择多个字段

    在 ASP NET C 中 我有一个结构 public struct Data public int item1 public int item2 public int category id public string category
  • 那里有更好的 DateTime.Parse 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道有一个库 付费或免费 能够处理比 DateTime Parse 使用的更常见的日期时间格式 能够
  • 在 C# 4.0 中,是否可以从泛型类型参数派生类?

    我一直在尝试这个 但我似乎无法弄清楚 我想做这个 public abstract class SingletonType
  • 为什么 C# 编译的正则表达式比等效的字符串方法更快?

    每次我必须对字符串执行简单的包含或替换操作 其中我正在搜索的术语是固定值 时 我发现如果我获取示例输入并对其进行一些分析 则使用编译的正则表达式是几乎 总是比使用 String 类中的等效方法更快 我尝试过比较多种方法 hs是要搜索的 干草
  • C++ 静态工厂构造函数

    我正在进行模拟 它需要创建多个相当相似的模型 我的想法是有一个名为 Model 的类并使用静态工厂方法来构造模型 例如 模型 createTriangle or 模型 createFromFile 我从以前的 java 代码中汲取了这个想法
  • Facebook Graph API“/userid/feed”返回空白

    我正在使用 Facebook C SDK 但似乎无法使用 Graph API 获取反馈数据 我已从用户那里获得了以下扩展权限 范围 离线访问 publish stream publish checkins create event read
  • 如何在 VB6 中读取子进程的标准输出?

    在VB6中创建进程时 涉及this https stackoverflow com questions 570295 can i spawn a synchronous process in vb6 and retrieve its ret
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • 可选参数代码在 .NET 3.5 中编译。为什么?

    这段代码在 VS 2010 的框架 3 5 项目中编译正常 我三次检查过 public LoggingClient string uri net msmq localhost logging 为什么 我在 C 4 规范中没有看到任何内容 文
  • 为什么没有参数的函数(与实际函数定义相比)可以编译?

    我刚刚看到某人的 C 代码 我很困惑为什么要编译它 有两点我不明白 The 函数原型与实际函数定义相比没有参数 中的参数函数定义没有类型 include

随机推荐

  • 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