我正在尝试解析一个文件(显然)以回车符结束其行,但是尽管它们具有相同的UTF8值,但它们在Swift中并没有被匹配。我可以看到解决该问题的方法,但我对这些字符的实际用途感到好奇。
这是一些示例代码,下面的输出。 (尽管我也尝试过使用“ \ r”来设置CR,但还是使用Character(“ \ r”)来设置它。
try f.forEach() { c in
print(c, terminator:" ") // DBG
if (c == "\r") {
print("Carriage return found!")
}
print(String(c).utf8.first!, terminator:" ")//DBG
print(String(describing:pstate)) // DBG
...
case .field:
switch c {
case CR,LF :
self.endline()
pstate = .eol
当它到达行尾时(在我的文本编辑器中这样显示),我得到了:
. 46 field
0 48 field
13 field
I 73 field
使用==或在switch语句中似乎不匹配。我应该为这个角色使用另一种方法吗?
(我将注意,解析以换行符结尾的文件可以很好地工作。)
答案 0 :(得分:1)
对于f.forEach
的含义,我有些困惑,但是如果变量c
的类型为Character,则可以将if
语句替换为:
if "\(c)".rangeOfCharacter( from: CharacterSet.newlines ) != nil
{
print("Carriage return found!")
}
这样,您就不必发明所有可能的换行符的列表。
答案 1 :(得分:0)
我确定了问题所在。通过查看c.unicodeScalars
,我发现行尾字符实际上是“ \ r \ n”,而不仅仅是“ \ r”。从我的代码中可以看出,我仅以UTF-8格式打印时才采用第一个。我不知道这是来自String.forEach还是文件本身。
我知道有一些测试来确定某些东西是否是换行符。 Swift 5直接拥有它们(c.isNewline
,还有Bill Nattaner指出的CharacterSet方法。
我对可以在我的switch语句中工作的东西感到更满意(因此我将明确定义每个对象),但是如果我希望处理各种各样的文件,那可能会改变。