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实现具有char
与signed char
相同,其他实现的char
与unsigned char
相同。 我不建议使用wchar_t
,这是特定于实现和操作系统(在Linux和Windows上不同)。
else if(c==''')
我还试过了
包含上述代码块的C源文件(很可能)也是UTF-8编码的,因此字符文字'''
是一个多字节字符文字(如'ab'
或'⬮'
也是),实际上它是U+2019 RIGHT SINGLE QUOTATION MARK
和'\342\200\231'
,其解释是特定于实现的。 通常,您应该避免在C源代码中避免使用此类多字节字符(在"éx⁂"
或注释等文字字符串之外)。
一个更好的方法可能是考虑在剥离所有非法字符后留下的字符。 如果它只是az
和其他几个,这是一个易于检测的范围。