如何获取字符的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
 */