C中的不同撇号

时间:2017-06-23 15:57:43

标签: c

我正在编写一个读取文本文件的程序,并将这些字符读入数组。

我需要在数组中逐个字符地完成它,并且我需要清理空格,标点符号和大小写的字符。

我已经编写了代码来执行此操作。但是,我所遵循的作业有一个特定的文本文档,我将要清理。

问题是文档中的撇号没有被ispunct函数标记。如果我删除文本文档中的撇号并用普通撇号替换它们,它可以正常工作。我认为这不够好,因为我不会使用我自己的文本文件来证明该程序的有效性。

我尝试过专门针对该撇号的声明:

否则if(c ==''')[从c = fgetc(fp)拉出],我得到一个多字符字符常量[-Wmultichar]。

这个小细节让我疯了,我不知道为什么撇号不同!

“那是”这是文档中的一段文字,当转换为十六进制等于74 68 61 74 e2 80 99 73。

2 个答案:

答案 0 :(得分:2)

也许您的输入是UTF-8编码的(这是一件好事,请阅读UTF8 everywhere)。只有您(或您的用户)可以告诉(但请阅读byte order marks)。在Linux上,file(1)命令通常可以猜测UTF-8编码的文本文件。

但是UTF-8是一个可变字节编码(一些Unicode字符由几个字节表示,而在几乎所有C11实现中,一个字节是char)最近的C11标准并不为人所知。所以你需要解析你的字节流为UTF-8。请注意,strlen不再给出UTF-8 字符的数量(或长度),而只是 bytes 中的长度。因此,您应该将char视为字节,而不是Unicode字符。

我建议使用一些外部库进行UTF-8解析,例如Glib Unicode Manipulation函数或更简单的libunistring。如果不允许使用这样的外部库,则可以通过跳过设置了较高位的每个char忽略每个多字节 UTF-8字符(但如果你想要的话可​​能会很棘手)编写可移植的C代码,因为某些C实现的charsigned char相同,而其他实现的charunsigned char相同。我不建议使用wchar_t,这是特定于实现和操作系统(在Linux和Windows上有所不同)。

  

我试过了else if(c=='’')

包含上述代码块的C源文件(很可能)也是UTF-8编码的,因此字符文字'’'是一个多字节字符文字(如'ab'或{{1}实际上它是 '⬮' ,与U+2019 RIGHT SINGLE QUOTATION MARK相同,其解释是特定于实现的。通常,您应该避免在C源代码中避免使用此类多字节字符(在'\342\200\231'或注释等文字字符串之外)。

答案 1 :(得分:0)

更好的方法可能是考虑在你剥夺了所有非法的字符后剩下的字符。如果它只是a-z以及其他一些,这是一个易于检测的范围。