C以便携和国际友好的方式删除换行符

时间:2015-04-23 19:07:01

标签: c parsing localization

这里有一个简单的问题,可能有一个棘手的答案:我正在寻找一种便携式本地化友好方式来删除C中的尾随换行符,最好是基于标准的。 / p>

我已经知道以下解决方案:

  • 解析\r\n的某种组合。处理Windows,* nix和Mac时,实际上并不漂亮,所有这些都使用不同的序列来表示新行。另外,其他语言是否甚至对新行使用相同的转义序列?我希望这会在使用不同英语字形(例如日语等)的语言中爆炸。

  • 删除尾随n字节并替换最终\0。看起来似乎是一种更加脆弱的方式。

  • isspace看起来很诱人,但我只需要匹配换行符。其他空格被视为有效的令牌文本。

  • C ++有一个类可以做到这一点但在纯C世界中对我没什么帮助。

  • locale.h似乎就像我所追求的那样,但我看不到任何与提取换行令牌有关的内容。

所以,有了这个,这是一个我将不得不滚动自己的实例#34;功能还是有什么我错过的?谢谢!

解决方案

我最后将Weather VaneLoic的答案分别合并为最终解决方案。有用的是使用方便的strcspn函数来打破从Loic提供的链接中选择的第一个换行符。因此,我可以根据许多支持的语言环境选择分隔符。一个好的观点是,在这个层面上有太多的支持一般;我甚至不知道西里尔文有几种竞争编码。

通过这种方式,我可以实现足够好的"多国支持,同时仍使用标准库函数。

因为我只能接受一个答案,所以我选择的是风向标,因为他是我用过的最后一次调用。话虽如此,这对我来说真的是两个答案。

3 个答案:

答案 0 :(得分:1)

我认识的最好的是

buffer [ strcspn(buffer, "\r\n") ] = 0;

这是处理\r\n的所有组合的安全方式 - 两者,一个或全部。

答案 1 :(得分:1)

我建议用一个标准空间(US-ASCII 0x20)替换一个或多个空白字符。仅考虑ISO-8859-1字符(https://en.wikipedia.org/wiki/ISO/IEC_8859-1),空格由0x00..0x20(C0控制字符和空格)和0x7F..0xA0(删除,C1控制字符和不间断空格)中的任何字节组成。 。请注意,US-ASCII是ISO-8859-1的子集。

但请注意,Windows 1251(https://en.wikipedia.org/wiki/Windows-1251)将不同的,可见(非控制)字符分配给0x80..0x9F范围。在这种情况下,这些字节不能被空格替换而不会丢失文本信息。

用于广泛定义空白字符的资源:

还要考虑到可以使用不同的编码,最常见的是:

但在非西方国家(例如俄罗斯,日本),进一步的角色编码也很常见。存在许多编码,但尝试支持每个已知编码可能没有意义。

因此尝试定义和限制您的用例,因为以完全通用性实现它意味着很多工作。

答案 2 :(得分:0)

这个答案适用于遇到同样问题的C ++用户。

匹配任何语言环境和字符类型的换行符都可以这样做:

if ["${CONFIGURATION}" != "Debug" ]; then
GOOGLE_APP_ID=1:1234567890:ios:ab123cd456ef789
"${PODS_ROOT}"/FirebaseCrash/upload-sym crash-service-account.json
fi

现在,删除所有尾随换行符可以这样做:

#include <locale>

template<class Char>
bool is_newline(Char c, std::locale const & loc = std::locale()) 
{
  // Translate character into default locale and character type.
  // Then, test against '\n', which is the only newline character there.
  return std::use_facet< std::ctype<Char>>(loc).narrow(c, ' ') == '\n';
}

这应该是绝对可移植的,因为它仅依赖于标准C ++函数。