C中的不同撇号

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

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

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

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

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

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

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

“那是”这是文档中的一段文本,当转换为hex等于74 68 61 74 e2 80 99 73。

也许您的输入是UTF-8编码(这是一件好事, 到处都可以阅读UTF8 )。 只有你(或你的用户)可以告诉(但读取字节顺序标记) 。 在Linux上, file(1)命令通常可以猜测UTF-8编码的文本文件。

但UTF-8是一个可变字节编码(一些Unicode字符由几个字节表示,在几乎所有C11实现中,一个字节是一个char ),并且最近的C11标准不知道。 因此,您需要将字节流解析为UTF-8。 请注意, strlen不再给出UTF-8 字符的数字(或长度),而只是字节长度。 因此,您应该将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''⬮'也是),实际上它是U+2019 RIGHT SINGLE QUOTATION MARK'\342\200\231' ,其解释是特定于实现的。 通常,您应该避免在C源代码中避免使用此类多字节字符(在"éx⁂"或注释等文字字符串之外)。

一个更好的方法可能是考虑在剥离所有非法字符后留下的字符。 如果它只是az和其他几个,这是一个易于检测的范围。