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

Kar*_*lek 2 unicode go

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

也就是说,要在此函数中添加什么-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
}

Run Code Online (Sandbox Code Playgroud)

icz*_*cza 5

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

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
Run Code Online (Sandbox Code Playgroud)

因此,要确定符文是否落在基本的多语言平面中,只需检查其是否在这些范围内即可。由于这些范围涵盖0和之间的所有值0xffff(包括两个值),因此请像这样检查它:

func isBMP(r rune) bool {
    return r >= 0 && r <= 0xffff
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

func isBMP(r rune) bool {
    return r >= 0 && r <= 0xffff && r != 0xfffd
}
Run Code Online (Sandbox Code Playgroud)