【问题标题】:How to represent Unicode characters in an API如何在 API 中表示 Unicode 字符
【发布时间】:2010-02-19 02:28:58
【问题描述】:

这更像是一个 MBCS 问题而不是 Unicode 问题。我需要创建一个 API,它返回一个结构列表,每个实例都将一个 Unicode 字符作为其成员之一。这是在 .NET 中,所以你会认为我想要 UTF-16,但是对于亚洲字符,需要两个字符。返回 Unicode 字符时的最佳做法是什么?

  1. 使用由 2 个 UTF-16 字符组成的数组 - 测试第一个字符以查看它是否是代理项,计算一下吗?
  2. 忽略代理问题,让调用者找出实际的字形编码跨度结构?
  3. 改用字符串,这样我才不管它是一两个字符的长度?
  4. 使用 UTF-32

人们通常为 UTF-8 做什么?我猜他们从不处理单个字符,并且所有内容都保存在字符串中(例如,在字符串中搜索字符实际上是通过查找子字符串来完成的)。也许是我的 C++ 程序员,但字符串似乎太重了。

我想我会做#3。别人做了什么?

【问题讨论】:

    标签: .net api unicode mbcs


    【解决方案1】:

    你对使用字符串是正确的。在 Unicode 中,因为即使是单个字符也可能需要多个代码点(每个代码点都会占用一定数量的字节,具体取决于编码),因此您实际上无法处理字符串以外的任何内容。即使像 isUpper 这样的函数也应该接受一个字符串并且只对它的第一个元素起作用。

    一个字符可能需要多个代码点的原因通常是因为组合字符、重音等。

    看到这个question in the Unicode FAQ

    【讨论】:

    • 起初我确信口音不会成为问题,但我认为实际上是。我假设会有一个规范化形式,可以使它全部适合单个代码点。就我而言,我想将字形 + 任意数量的重音符号视为单个“字符”。
    • 是的,只有一些重音字符适合单个代码点,通常来自预 unicode 字符集的字符。
    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多