在Swift

时间:2019-07-18 21:54:40

标签: swift character-encoding

我正在尝试解析一个文件(显然)以回车符结束其行,但是尽管它们具有相同的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语句中似乎不匹配。我应该为这个角色使用另一种方法吗?

(我将注意,解析以换行符结尾的文件可以很好地工作。)

2 个答案:

答案 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语句中工作的东西感到更满意(因此我将明确定义每个对象),但是如果我希望处理各种各样的文件,那可能会改变。