【问题标题】:mbrtowc: howto determine number of characters to skip if null character is readmbrtowc:如果读取空字符,如何确定要跳过的字符数
【发布时间】:2017-01-15 18:25:38
【问题描述】:

根据 C99 规范,mbrtowc 函数返回 0

如果接下来的 n 个或更少的字节完成了多字节字符 对应于空宽字符(即存储的值)。

在编码的空字符后立即继续读取输入的最佳方法是什么?

我当前的解决方案是使用给定的编码转换空宽字符,以确定下次调用 mbrtowc 时要跳过的输入字节数。但可能有更优雅的方式来做到这一点。

另外,我想知道mbrtowc 这种行为背后的基本原理是什么。

【问题讨论】:

  • 只是想知道为什么要使用宽字符?如果是处理 Unicode,那你就错了。
  • 我要统计字符数。
  • 我不明白。为什么不使用wcslen() 中的strlen()? XY 问题?随意添加您的代码。
  • 因为我没有字符串,而是具有某些编码的文件。这些文件是逐字符解析的。

标签: c character-encoding c99


【解决方案1】:

一个字节。无论移位状态如何,空字节始终表示空字符,并且不能作为多字节字符的一部分参与。其来源是:

5.2.1.2 多字节字符

...

  • 所有位为零的字节应解释为与移位状态无关的空字符。这样的字节不应作为任何其他多字节字符的一部分出现。

【讨论】:

  • 这真的有用吗?当读取具有固定长度编码的外部存储数据时,例如UTF-32,我希望空字符的编码超过一个字节。要跳过输入缓冲区中的这些字节,需要知道它们的数量。
  • @aventurin:UTF-32 不是多字节编码。你不能用mbrtowc阅读它。
  • 我不知道,但预计标准 c 中会有一种机制来读取具有任意编码的文件。即使 UTF-32 不符合多字节编码的条件,也可能有其他编码(例如修改后的 UTF-8)不将空字符编码为单字节。但现在我猜这些也不符合标准 c 意义上的多字节编码。
  • @aventurin: mbrtowc 甚至不是读取具有任意多字节编码的文件的机制;它仅用于读取语言环境编码中的文件。 Plain C 没有按名称读取任意/众所周知的编码的功能;你可以在iconv 接口中使用 POSIX 来实现它,或者你可以自己实现它(或使用其他人的库),因为编码是完全指定的,不需要为了可移植性而抽象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多