在Swift中的不可打印字符上拆分字符串

时间:2014-09-22 11:34:48

标签: unicode utf-8 swift barcode

我正在尝试将我从条形码中读取的字符串拆分为Swift中的数组,并且在讨论代码点,unicode标量和字形集群时我有点迷失......

条形码字符串包含“FNC1”分隔符,我认为它具有232或29的ASCII值(我发现了相互矛盾的文档),因此该字符串具有以下形式:

FNC1019931265099999891T77FNC1203000FNC19247

我希望正确的数组拆分输出为: ["019931265099999891T77", "1203000", "19247"]

我尝试过这样的方法:

var codeArray = barcodeString.componentsSeparatedByString("\u{232}")var codeArray = barcodeString.componentsSeparatedByString("\u{29}")

但是找不到"\u{232}""\u{29}",所以我的语法错误或者FNC1的ascii值不正确。

如果我遍历barcodeString打印每个字符的utf8值,FNC1字符就会显示为整数29,但我相信这是一个代码点而不是整数 - 我当然不能做一个基于整数的比较检测它,这会产生编译错误。

找出如何在Swift字符串中表示此字符并对其进行比较/拆分的正确方法是什么?

更新 问题归结为如何从单个字符中找到ascii代码值以及如何以另一种方式查找,如果您有一个整数ascii代码值,则生成一个字符。

我发布了我的hacky解决方案作为答案,但必须有一个更整洁,更强大的方法来做到这一点。

3 个答案:

答案 0 :(得分:0)

所以我提出的最好的方法是循环查看每个字符的字符串,将每个字符转换为字符串,这样我就可以得到一个值。

由于我无法找到直接获取字符的ascii值的方法,因此必须将每个字符转换为字符串,然后unicodeScalars属性允许我访问表示字符串元素的值,这些值是UInt32,因此可以将它们与不可打印的字符的整数值进行比较,并进行一些类型转换。

凌乱但到目前为止我找到了唯一的答案。

    func barcodeStringToArray(inputString: String, asciiValue: Int, splitString: String) -> Array<String>? {
        var results = [""]
        var replacedString = ""

        for myChar in inputString {
            let tmpString: String = String(myChar)
            for myChar in tmpString.unicodeScalars {
                if myChar.value == UInt32(asciiValue) {
                    replacedString += splitString
                } else {
                    replacedString += "\(myChar)"
                }
                //Can there ever be more than one element in this array?
                //Does an extended grapheme clusters come up as multiple elements?
                break
            }
        }
        results = replacedString.componentsSeparatedByString(splitString)
        //Now remove any empty arrays
        results = results.filter({$0 != ""})
        return results
    }

答案 1 :(得分:0)

我发现了一个有趣的案例,

方法1

var data:[String] = split( featureData ) { $0 == "\u{003B}" }

当我使用此命令从服务器加载的数据中拆分符号时,它可以在模拟器中进行测试时拆分并与测试设备同步,但不会在发布应用中拆分,和特设

我需要花费大量时间来跟踪此错误,它可能会受到一些Swift版本或某些iOS版本的诅咒,或者

这也不是关于HTML代码,因为我尝试 stringByRemovingPercentEncoding 并且它仍然不起作用


方法2

var data:[String] = featureData.componentsSeparatedByString("\u{003B}")

当我使用此命令时,它可以拆分从服务器正确加载的相同数据


结论,我真的建议使用方法2

string.componentsSeparatedByString("")

答案 2 :(得分:0)

斯威夫特4。

extension String {
    func removingAllInstancesOfChar(character: UInt32) -> String {

        var returnString = String()

        for myChar in self {
            let tmpString: String = String(myChar)
            for myChar in tmpString.unicodeScalars {
                if myChar.value != UInt32(character) {
                    returnString += "\(myChar)"
                }
            }
        }

        return returnString
    }

    func replaceAllInstancesOfChar(character: UInt32, replacement: String) -> String {
        var replacedString = ""

        for myChar in self {
            let tmpString: String = String(myChar)
            for myChar in tmpString.unicodeScalars {
                if myChar.value == UInt32(character) {
                    replacedString += replacement
                } else {
                    replacedString += "\(myChar)"
                }
                break
            }
        }
        return replacedString
    }
}

更新了@ benz001代码,只需处理带有unicode字符的字符串...替换并删除...或者。

所以...

inputString.replaceAllInstancesOfChar(character: 29, replacement: "|") // separators
inputString.removingAllInstancesOfChar(character: 30) // start/stop byte