【问题标题】:How to get codepoint of particular WCHAR character?如何获取特定 WCHAR 字符的代码点?
【发布时间】:2012-06-06 10:48:39
【问题描述】:

例如我这里需要第5个字符的codepoint,即ð

const WCHAR* mystring = L"Þátíð";

我知道它有代码点:U+00F0 - 但是如何使用 c++ 获取这个整数?

【问题讨论】:

  • wchar_t 是编译器特定的类型,WCHAR 表示 Windows (wchar_t==WCHAR==UCS2/UTF16LE) 如果想要可移植性,则需要将 WCHAR 更改为 wchar_t。如果这只是 Windows,则应使用 windows 标签对其进行标记...

标签: c++ wchar-t


【解决方案1】:

Windows 2000 及更高版本中的 WCHAR 是 UTF-16LE,因此按索引访问字符串中的特定字符不一定安全。您应该使用CharNext 之类的东西来遍历字符串,以正确处理代理对和组合字符/变音符号。

在这个特定示例中,Forgottn 的答案取决于编译器发出的 áí 字符的预组合版本...(对于大多数 Windows 编译器来说,这可能是正确的,移植到 Mac OS 可能会有问题)

【讨论】:

    【解决方案2】:
    const WCHAR myString[] = L"Þátíð";
    size_t myStringLength = 0;
    if(SUCCEEDED(StringCchLengthW(myString, STRSAFE_MAX_CCH, &myStringLength))
    {
        LPCWSTR myStringIterator = myString;
        for(size_t sz = 0; sz < myStringLength; ++sz)
        {
            unsigned int mySuperSecretUnicodeCharacter = *myStringIterator;
            LPCWSTR myNextIterator = CharNext(myStringIterator);
            std::vector<unsigned int> diacriticsOfMySuperSecretUnicodeCharacter(myStringIterator+1, myNextIterator);
            myStringIterator = myNextIterator;
        }
    }
    

    编辑 1:让它真正起作用

    编辑 2:让它实际查找所有代码点

    【讨论】:

    • 好吧,我放弃了……这个:U+0061 U+0301 U+0302 U+0303 U+0304 (a´^~¯) 不能被任何“正常”类型持有。假设你永远无法知道真正的代码点。
    • 一个 Unicode 代码点(Unicode 代码空间中的一个值)将适合 32 位,但用户所谓的“字符”可能不适合...
    猜你喜欢
    • 1970-01-01
    • 2012-01-26
    • 2021-02-17
    • 2023-03-14
    • 2021-07-18
    • 1970-01-01
    • 2010-09-28
    相关资源
    最近更新 更多