【发布时间】:2011-11-12 18:24:51
【问题描述】:
我很难相信我是第一个遇到这个问题的人,但我搜索了很长时间,但没有找到解决方案。
我想使用 strncpy,但让它支持 UTF8,这样它就不会将 utf8 字符部分写入目标字符串。
否则,您永远无法确定生成的字符串是有效的 UTF8,即使您知道源是(当源字符串大于最大长度时)。
验证结果字符串可以工作,但如果要经常调用它,最好有一个 strncpy 函数来检查它。
glib 有 g_utf8_strncpy 但这会复制一定数量的 unicode 字符,而我正在寻找一个受字节长度限制的复制函数。
明确地说,“utf8 感知” 是指它不应超过目标缓冲区的限制,并且它必须从不仅复制 utf 的一部分-8 个字符。 (给定有效的 utf-8 输入决不能导致无效的 utf-8 输出)。
注意:
一些回复指出strncpy 将所有字节都归零,并且它不会确保零终止,回想起来我应该要求一个支持 utf8 的 strlcpy,但是当时我没有'不知道这个函数的存在。
【问题讨论】:
-
通常你使用完全支持 UTF-8 的库,比如 ICU icu-project.org 来解决这些问题,最后,谁保证一个 char* 是一个 UTF-8 字符串,而不是随机垃圾 null 终止?
-
那又怎样?
strncpy也不保证会产生一个以零结尾的 C 字符串。与广泛传播的看法相反,strncpy 不是“字符串”函数,而是缓冲区处理函数。它的两个经常被遗忘的副作用提供了一个线索(它的第二个副作用是给定大小的缓冲区归零)。 -
@Zan Lynx,无法调整大小的目标字符串,整个 API/结构等都依赖于固定字符串。
-
@tristopia,我不明白你的意思,因为你有自己的 utf8 strncpy,它可以很容易地调整为你喜欢的关于 NULL 终止的行为。
-
实现这一点的iconv界面非常简单:只需将utf8转换为utf8并故意缩短outbytesleft。