Unicode 在Swift中拆分不可打印字符上的字符串
我试图在Swift中将从条形码中读取的字符串拆分为一个数组,但在讨论码点、unicode标量和grapheme集群时,我有点迷失了方向 条形码字符串包含“FNC1”分隔符,我认为其ASCII值为232或29(我发现有冲突的文档),因此字符串的形式如下:Unicode 在Swift中拆分不可打印字符上的字符串,unicode,utf-8,swift,barcode,Unicode,Utf 8,Swift,Barcode,我试图在Swift中将从条形码中读取的字符串拆分为一个数组,但在讨论码点、unicode标量和grapheme集群时,我有点迷失了方向 条形码字符串包含“FNC1”分隔符,我认为其ASCII值为232或29(我发现有冲突的文档),因此字符串的形式如下: FNC1019931265099999891T77FNC120300FNC19247 我希望正确的阵列分割输出为: [“019931265099999891T77”、“1203000”、“19247”] 我尝试过这样的方法: var-codeAr
FNC1019931265099999891T77FNC120300FNC19247
我希望正确的阵列分割输出为:
[“019931265099999891T77”、“1203000”、“19247”]
我尝试过这样的方法:
var-codeArray=barcodeString.componentsSeparatedByString(“\u{232}”)
及
var codeArray=barcodeString.componentsSeparatedByString(“\u{29}”)
但是没有找到“\u{232}”
或“\u{29}”
,因此我的语法错误或FNC1的ascii值不正确
如果我在条形码字符串中循环打印每个字符的utf8值,FNC1字符就会显示为整数29,但是我相信这是一个码点而不是整数-我当然不能进行基于整数的比较来检测它,这会导致编译器错误
正确的方法是什么来计算这个字符在Swift字符串中的表示方式并与之进行比较/拆分
更新
问题归结为如何从单个字符中查找ascii码值,以及如何从另一个方向查找,如果您有整数ascii码值,则生成一个字符
我已经发布了我的黑客解决方案作为答案,但必须有一种更简洁、更健壮的方法来解决这个问题。所以我想到的最好方法是在字符串中循环查看每个字符,将每个字符转换成一个字符串,这样我就可以得到它的值 由于我找不到直接获取字符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
}
func条码字符串数组(inputString:String,ascivalue:Int,splitString:String)->数组?{
变量结果=[“”]
var replacedString=“”
对于inputString中的myChar{
让tmpString:String=String(myChar)
对于tmpString.unicodeScalars中的myChar{
如果myChar.value==UInt32(ascivalue){
replacedString+=splitString
}否则{
替换字符串+=“\(myChar)”
}
//此数组中是否可以有多个元素?
//扩展的grapheme集群是作为多个元素出现的吗?
打破
}
}
结果=replacedString.ComponentSeparatedByString(拆分字符串)
//现在删除所有空数组
results=results.filter({$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("")
斯威夫特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字符的字符串…替换并删除…或者
所以
究竟哪个不可打印字符用作分隔符真的很重要吗?您可以简单地拆分既不是(ASCII)字母也不是数字的字符吗?我想我可以在正则表达式中搜索任何不是a-zA-Z0-9的字符,并在该示例中拆分;但我确实需要解决如何识别特定的不寻常字符的问题——有多种FNC*代码可以具有上下文特定的含义,所有这些都是Swift字符串中的有效字符,因此,在我能够与它们进行比较之前,我并不能真正控制可能被我丢弃的条形码。
inputString.replaceAllInstancesOfChar(character: 29, replacement: "|") // separators
inputString.removingAllInstancesOfChar(character: 30) // start/stop byte