【问题标题】:How do I normalize a string using ICU4C?如何使用 ICU4C 规范化字符串?
【发布时间】:2012-05-04 10:55:02
【问题描述】:

我发现 ICU 文档有点挑战性。

我的问题是:如何使用 ICU4C 规范化字符串?

我正在查看 unorm2_normalize,但是如果缓冲区不够大怎么办?我以前怎么会知道这个?当然,我想规范化整个字符串。

谢谢! :>

附:这是该函数的 API 文档:http://icu-project.org/apiref/icu4c/unorm2_8h.html#a0a596802db767da410b4b04cb75cbc53

【问题讨论】:

  • 如果您对 ICU 不满意,请查看libunistring,这可能更合适...
  • 我查看了 libunistring,但似乎它自 2010 年以来就没有更新过。我会使用 Unicode 6 的很多功能。不过谢谢 :)

标签: c unicode icu normalize


【解决方案1】:

您会从 pErrorCode 参数中的所有这些函数调用中获得错误代码。这就是你如何调用这样的函数:

UErrorCode error = U_ZERO_ERROR;
unorm2_normalize( ... &error );
....
if( !U_SUCCESS( error ) )
{
    // handle error...
}

以下是错误代码:http://icu-project.org/apiref/icu4c/utypes_8h.html#a3343c1c8a8377277046774691c98d78c

在你的情况下,你可能想做这样的事情:

if( error == U_STRING_NOT_TERMINATED_WARNING
   || error == U_BUFFER_OVERFLOW_ERROR )
{
    // enlarge the buffer...
}

【讨论】:

  • 你好,你好! :) 谢谢你的回答。尝试将某些东西标准化似乎是浪费时间,当它不起作用时,从头开始。规范化器实例是否跟踪它的位置?如何处理规范器实例?
  • 我不知道这是否可能,我还没有使用这个库。我建议采用以下方法之一: 1. 如果您希望输入字符串已经规范化并且只想确保:以最终目的地作为缓冲区调用它,如果它太小,则使用更大的临时缓冲区再次调用它. 2. 如果您期望字符串通常需要规范化:使用更大的临时缓冲区调用它,您也可以将其用于其他事情,并在函数调用后知道最终大小并将其复制到那里时分配最终目的地。跨度>
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 2018-09-29
  • 2020-02-12
  • 2012-04-25
  • 2019-09-24
相关资源
最近更新 更多