检查符文是否在基本多语言平面中的正确方法是什么?



我想检查一下,给定的符文是否在基本的多语言平面中。

也就是说,在这个函数中放什么 - https://play.golang.org/p/3szTn8pP7xe

package main
import (
"fmt"
)
func isBMP(r rune) bool {
// ???
return false
}
func main() {
fmt.Println(isBMP(rune('պ'))) // expect true
fmt.Println(isBMP(rune('😂'))) // expect false
}

基本多语言平面分配了以下代码点范围:

0000–​0FFF    8000–​8FFF
1000–​1FFF    9000–​9FFF
2000–​2FFF    A000–​AFFF
3000–​3FFF    B000–​BFFF
4000–​4FFF    C000–​CFFF
5000–​5FFF    D000–​DFFF
6000–​6FFF    E000–​EFFF
7000–​7FFF    F000–​FFFF

因此,要判断符文是否落在基本的多语言平面中,只需检查它是否落在这些范围内即可。由于这些范围涵盖了00xffff(包括两者(之间的所有值,因此只需像这样检查它:

func isBMP(r rune) bool {
return r >= 0 && r <= 0xffff
}

请注意,由于runeint32的别名,它可能具有负值,因此检查它是否不是负值也很重要。

这将输出您的预期结果。在Go Playground上尝试一下。

注意 #2:遍历包含无效 UTF-8 字节的字符串的符文,您将获得无效字节的 Unicode 替换字符,即0xfffd。如果要从测试中排除这些内容,可以对其进行修改,如下所示:

func isBMP(r rune) bool {
return r >= 0 && r <= 0xffff && r != 0xfffd
}

我对go不太熟悉。然而,一些谷歌表明符文实际上是一个 int32,所以基本的多语言平原中的任何内容都有一个介于 0 和 65535 之间的代码点,你应该能够做到这一点

func isBMP(r rune) bool {
if r <= 65535 {
return true
}
else {
return false
}
}

最新更新