我想检查一下,给定的符文是否在基本的多语言平面中。
也就是说,在这个函数中放什么 - 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
因此,要判断符文是否落在基本的多语言平面中,只需检查它是否落在这些范围内即可。由于这些范围涵盖了0
和0xffff
(包括两者(之间的所有值,因此只需像这样检查它:
func isBMP(r rune) bool {
return r >= 0 && r <= 0xffff
}
请注意,由于rune
是int32
的别名,它可能具有负值,因此检查它是否不是负值也很重要。
这将输出您的预期结果。在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
}
}