【发布时间】:2016-07-21 19:53:14
【问题描述】:
在某些系统上有 regwcomp(3) 等函数,但目前这似乎不是一个可移植的解决方案。当有 wchar_t 字符串时,使用 regex(3) 函数(通常仅适用于 char 字符串)的建议可移植解决方案(不是 Linux 或 GNU 特定)是什么?在我的情况下,匹配的模式或文本并不是非 7 位 ASCII,问题在于代码出于其他原因使用了 wchar_t。
【问题讨论】:
-
我目前使用
wcstombs(3) 和mbstowcs(3) 在char 和wchar_t 字符串之间进行转换。问题是,当我在转换后的字符串上使用regexec(3) 时,我不能简单地将regmach_t响应分配给 wchar_t 字符串中的位置。这在使用iconv()(恕我直言)时是一样的。 -
是的。当然,您可以在每个位置临时插入一个'\0',并使用
mbstowcs(NULL, beginning, 0)来计算该位置的宽字符数。对于一般的多字节字符集情况,您不能只计算两个位置之间的宽字符数,因为这会丢失移位状态。另一方面,UTF-8 是微不足道的(无移位状态),因此对字符串的单次传递可以将所有匹配位置转换为 wchar_t 位置。 -
如果OP或其他人不清楚,在初始化locale后,可以使用
nl_langinfo(CODESET)获取当前locale使用的字符集或编码,格式应该是@可以接受的987654325@(尽管您可能希望附加//TRANSLIT和/或//IGNORE后缀)。 -
我使用
setlocale(LC_ALL, "");来确定语言环境。事实上,我只对 UTF-8 感兴趣,并不打算支持其他语言环境(C除外)。好的,我可能会对wcstombs转换和位置猜测进行一些修改。可惜regwcomp等不是POSIX...