如何获取字符的Unicode码点?
如何提取给定如何获取字符的Unicode码点?,unicode,swift,Unicode,Swift,如何提取给定字符的Unicode码点,而不首先将其转换为字符串?我知道我可以使用以下方法: let ch: Character = "A" let s = String(ch).unicodeScalars s[s.startIndex].value // returns 65 但似乎应该有一种更直接的方法来实现这一点,只需使用Swift的标准库。《语言指南》部分只讨论了在字符串中迭代字符,而不是直接使用字符s。根据我在文档中收集的信息,他们希望您从字符串中获取字符值,因为它提供了上下文。这是
字符的Unicode码点
,而不首先将其转换为字符串
?我知道我可以使用以下方法:
let ch: Character = "A"
let s = String(ch).unicodeScalars
s[s.startIndex].value // returns 65
但似乎应该有一种更直接的方法来实现这一点,只需使用Swift的标准库。《语言指南》部分只讨论了在
字符串
中迭代字符,而不是直接使用字符
s。根据我在文档中收集的信息,他们希望您从字符串
中获取字符
值,因为它提供了上下文。这是用UTF8、UTF16或21位代码点(标量)编码的字符
如果您查看在Swift框架中如何定义字符
,它实际上是一个枚举
值。这可能是由于String.utf8
、String.utf16
和String.unicodeScalars
中的各种表示法造成的
似乎他们不希望您使用
字符
值,而是使用字符串
,而您作为程序员决定如何从字符串
本身获取这些值,从而允许保留编码
也就是说,如果您需要以简洁的方式获取代码点,我建议您使用如下扩展:
extension Character
{
func unicodeScalarCodePoint() -> UInt32
{
let characterString = String(self)
let scalars = characterString.unicodeScalars
return scalars[scalars.startIndex].value
}
}
然后您可以这样使用它:
let char : Character = "A"
char.unicodeScalarCodePoint()
总之,当你考虑到所有的可能性时,字符串和字符编码是一件棘手的事情。为了让每一种可能性都得到体现,他们采用了这一方案
还要记住,这是一个1.0版本,我相信他们很快就会扩展Swift的语法糖。我认为问题在于
字符
不代表Unicode码点。它表示一个“Unicode grapheme集群”,它可以由多个代码点组成
相反,UnicodeScalar
表示一个Unicode代码点。您是否尝试过:
import Foundation
let characterString: String = "abc"
var numbers: [Int] = Array<Int>()
for character in characterString.utf8 {
let stringSegment: String = "\(character)"
let anInt: Int = stringSegment.toInt()!
numbers.append(anInt)
}
numbers
<代码>导入基础
let characterString:String=“abc”
变量编号:[Int]=数组()
对于characterString.utf8中的字符{
let stringSegment:String=“\(字符)”
让anInt:Int=stringSegment.toInt()!
数字。追加(anInt)
}
数字
输出:
[97,98,99]
字符串中可能只有一个字符。我同意您的看法,应该有一种方法可以直接从字符中获取代码。但我能提供的只是一个速记:
let ch: Character = "A"
for code in String(ch).utf8 { println(code) }
我认为对Unicode有一些误解。Unicode本身不是一种编码,它不会将任何字形簇(或人类阅读中的“字符”)转换成任何类型的二进制序列。Unicode只是一个大表,它收集了地球上所有语言(非正式地也包括克林贡语)使用的所有字形集群。这些图形集簇由代码点(swift中的21位数字,看起来像U+D800)组织和索引。通过使用代码点,您可以在大Unicode表中找到要查找的字符的位置 同时,名为UTF8、UTF16、UTF32的协议实际上是编码。是的,有多种方法可以将Unicode字符编码为二进制序列。使用哪种协议取决于您正在工作的项目,但大多数网页都是由UTF-8编码的(您现在可以实际检查它) 概念1:Unicode点在Swift中称为Unicode标量 Unicode标量是U+0000到U+D7FF(含)或U+E000到U+10FFFF(含)范围内的任何Unicode代码点。Unicode标量不包括Unicode代理项对代码点,这些代码点的范围为U+D800到U+DFFF(含U+DFFF) 概念2:编码单元是编码的抽象表示 考虑下面的代码片段
let theCat = "Cat!#1. Using Unicode.Scalar
's value
property
With Swift 5, Unicode.Scalar
has a value
property that has the following declaration:
A numeric representation of the Unicode scalar.
var value: UInt32 { get }
让Cat=“Cat!#1.使用Unicode.Scalar
的value
属性
对于Swift 5,Unicode.Scalar
具有具有以下声明的属性:
Unicode标量的数字表示形式
以下示例代码显示了如何迭代字符的unicodeScalars
属性,并打印组成该属性的每个Unicode标量的值:
let character: Character = "A"
let scalars = character.unicodeScalars
let firstScalar = scalars[scalars.startIndex]
print(firstScalar.value)
/*
prints: 65
*/
或者,如果只想打印字符的第一个unicode标量的值,可以使用下面的示例代码:
var asciiValue: UInt8? { get }
#2.使用字符
的ascivalue
属性
如果您真正想要的是获取字符的ASCII编码值,则可以使用character
。ascivalue
具有以下声明:
如果为ASCII,则返回此字符的ASCII编码值
下面的示例代码显示了如何使用ascivalue
:
let character: Character = "П"
print(String(describing: character.asciiValue))
/*
prints: nil
*/
Character
值肯定有足够的上下文来确定代码点:例如,它们可以打印并连接到String
s和其他Character
s,否则通过String
的解决方案就不起作用了。我的结论正确吗?这是e我相信这可能是他们为了时间而从1.0版本中删掉的东西。我可以看到它“对大多数开发人员来说已经足够有效了”“目前还不确定整数是什么,但这很难处理。我将返回Int。Beta4增加了完整字符支持,字符现在可以容纳完整的grapheme集群。见:作者:OleBegemann@Erik_at_Digit您的代码不再有效。请查看此问题。在其他情况下,您必须返回UInt32
,而不是Int
,swift中的字符不一定是单个Unicode码点。例如,让ch:Character=“E\u0308”
。一般来说,码点和字符是不同的概念
let character: Character = "A"
print(String(describing: character.asciiValue))
/*
prints: Optional(65)
*/
let character: Character = "П"
print(String(describing: character.asciiValue))
/*
prints: nil
*/