gpt4 book ai didi

c++ - Unicode字符串的跨平台迭代(使用ICU计算字形)

转载 作者:IT老高 更新时间:2023-10-28 21:57:48 26 4
gpt4 key购买 nike

我想迭代 Unicode 字符串的每个字符处理每个代理对并将字符序列组合为一个单元(一个字形)。

示例

文本“नमस्ते”由以下代码点组成:U+0928、U+092E、U+0938、U+094D、U+0924、U+0947,其中,U+0938U+0947组合标记

static void Main(string[] args)
{
const string s = "नमस्ते";

Console.WriteLine(s.Length); // Ouptuts "6"

var l = 0;
var e = System.Globalization.StringInfo.GetTextElementEnumerator(s);
while(e.MoveNext()) l++;
Console.WriteLine(l); // Outputs "4"
}

所以我们在 .NET 中有它。我们还有 Win32 的 CharNextW()

#include <Windows.h>
#include <iostream>
#include <string>

int main()
{
const wchar_t * s = L"नमस्ते";

std::cout << std::wstring(s).length() << std::endl; // Gives "6"

int l = 0;
while(CharNextW(s) != s)
{
s = CharNextW(s);
++l;
}

std::cout << l << std::endl; // Gives "4"

return 0;
}

问题

我所知道的两种方式都是微软特有的。有便携方法吗?

  • 我听说过 ICU,但我无法快速找到相关内容(UnicodeString(s).length() 仍然给出 6)。指向 ICU 中的相关功能/模块是一个可以接受的答案。
  • C++ 没有 Unicode 的概念,因此处理这些问题的轻量级跨平台库将是一个可以接受的答案。

编辑:使用 ICU 的正确答案

@McDowell 提示使用来自 ICU 的 BreakIterator,我认为这可以被视为处理 Unicode 的事实上的跨平台标准。下面是一个示例代码来演示其用法(因为示例令人惊讶地很少见):

#include <unicode/schriter.h>
#include <unicode/brkiter.h>

#include <iostream>
#include <cassert>
#include <memory>

int main()
{
const UnicodeString str(L"नमस्ते");

{
// StringCharacterIterator doesn't seem to recognize graphemes
StringCharacterIterator iter(str);
int count = 0;
while(iter.hasNext())
{
++count;
iter.next();
}
std::cout << count << std::endl; // Gives "6"
}

{
// BreakIterator works!!
UErrorCode err = U_ZERO_ERROR;
std::unique_ptr<BreakIterator> iter(
BreakIterator::createCharacterInstance(Locale::getDefault(), err));
assert(U_SUCCESS(err));
iter->setText(str);

int count = 0;
while(iter->next() != BreakIterator::DONE) ++count;
std::cout << count << std::endl; // Gives "4"
}

return 0;
}

最佳答案

您应该可以使用 ICU BreakIterator为此(假设它与 Java 版本功能等效的字符实例)。

关于c++ - Unicode字符串的跨平台迭代(使用ICU计算字形),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4579215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com