【问题标题】:Portable way to use the regex(3) functions on a wide char string in C在 C 中的宽字符字符串上使用 regex(3) 函数的可移植方式
【发布时间】:2016-07-21 19:53:14
【问题描述】:

在某些系统上有 regwcomp(3) 等函数,但目前这似乎不是一个可移植的解决方案。当有 wchar_t 字符串时,使用 regex(3) 函数(通常仅适用于 char 字符串)的建议可移植解决方案(不是 Linux 或 GNU 特定)是什么?在我的情况下,匹配的模式或文本并不是非 7 位 ASCII,问题在于代码出于其他原因使用了 wchar_t。

【问题讨论】:

  • regcomp() 等。是 POSIX.1-2001,这就是为什么它们是可移植的。不幸的是,POSIX 没有宽字符正则表达式支持。唯一真正的可移植选项是使用 iconv() 在 UTF-8 和 wchar_t 之间进行转换(iconv_open("UTF-8//TRANSLIT", "WCHAR_T") 用于转换为 UTF-8 的句柄,iconv_open("WCHAR_T//TRANSLIT", "UTF-8") 用于转换回 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...

标签: c regex wchar-t


【解决方案1】:

如果其他人有这个问题,请随意借用我最近编写的函数 my_regwcomp 和 my_regwexec。您可以在此source file in the ProofPower system 中找到它们。这些函数使用 POSIX regcomp 和 regexec 函数模拟 Free BSD 的 regwcomp 和 regwexec 函数。

PS:我的代码是 Motif 应用程序的一部分,如果你用 malloc、ralloc 和 free 替换 XtMalloc、XtRealloc 和 XtFree,它应该可以在任何标准 C/C++ 开发框架中工作。如果您需要任何帮助以使我的功能在您的环境中运行,请在此答案中添加评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-28
    • 2019-09-25
    • 2016-10-06
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多