考虑这个例子:
zh_Hant_HK format = yy'年'M'月'd'日' ah:mm
不确定你是否能看到它,但我看到很多中国符号。我从日期格式化程序中获取了该字符串,该格式化程序对应于亚洲语言环境。在尝试通过“字符”获取“字符”时,我是否必须考虑任何特殊内容,即在此字符串中单独查看每个字符?
答案 0 :(得分:1)
当您一次偷看NSString
个字符的字符时,不要特别考虑。构建NSString
以使用unicode字符串。
for(int index = 0; index < [myString length]; index++) {
unichar ch = [myString characterAtIndex:index];
// Do stuff to unichar...
}
您应该做的一件事就是始终将您从NSString
检索到的字符视为unichar
类型。 unichar
类型与wchar_t
或任何其他unicode字符类型不等效。
答案 1 :(得分:0)
如果您的字符串知道编码(如果从日期格式中删除它应该是这样),那么您可以使用characterAtIndex:获取unichar表示,或者您希望访问单个字符。< / p>
知道自己想做什么可能非常有用。将其分解为子串可能是最好的,因为子串会随身携带它们的编码和语言环境。
答案 2 :(得分:-1)
取决于字符串的表示形式。
曾几何时,我们有简单的字符串表示(例如ASCII),其中所有字符代码占用字符串中的单个空格单元(忽略最顶层的8位)。 [之前有6位和9位的字符串表示,但它们具有相同的属性 是固定大小的单位。)
处理非英语语言(东欧,亚洲......)导致人们提出各种所谓的“双字节字符串”(DBCS),其中常见的字符占用一个单元,(漂亮)与ASCII字符大致相同的设置现在几乎普遍为8位,但其他字符编码为两个字节,第一个占用ASCII不需要的8位空间的一部分,第二个字节,提供一个具有~~ 15位字符的字符编码方案。
撕掉这些字符串很麻烦,因为执行此操作的例程必须理解精确的DBCS编码方案,并按照一次拾取1或2个字节。
随着Unicode的出现,通过提供16位字符来解决问题。大多数现代编程语言(Java,C#)提供这些16位字符作为其字符串表示的基础。生活变得容易得多(如果我们忽略这样一个事实,即使是16位unicode有时也会允许两个连续的字符组合形成相当于已经在集合中定义的另一个字符)。
然而,增强Unicode的委员会无法抗拒,并且扩展了超过16位的Unicode。我们现在仍然坚持使用Unicode应该修复的哑DBCS方案(实际上更糟糕的是,有些需要几个字节,IIRC)。所以,要处理那些字符串 现代语言,你再次必须理解一个字节代表一个字符,以及它代表一个多字符序列的引入。
如果幸运的话,您拥有的字符串仅由Unicode中的16位单字符组成。如果没有,你需要查阅你的Unicode手册,并祈祷你有一个Unicode字符串管理库来帮助你做到这一点。
这最后一点是如此巨大的麻烦,很多程序员都在努力并坚持使用Unicode作为单一广角的字符。在欧洲工作。不推荐在亚洲使用。