如何将两个代码点组合成一个?

我知道 unicode 代码点Á是U+00C1. 我在互联网和许多论坛和文章上阅读,我也可以Á通过组合字符´(unicode:)U+00B4和A(unicode:)来制作它们U+0041。


我的问题很简单。怎么做?我试过这样的事情。我决定在 golang 中尝试一下,但如果有人知道如何在 python(或其他一些编程语言)中进行操作,那就太好了。对我来说没关系。


好的,所以我接下来尝试了。


A二进制是:01000001


´二进制是:10110100


它总共需要 15 位,所以我需要 UTF-8 3 字节格式 ( 1110xxxx  10xxxxxx  10xxxxxx)


通过在 x 的位置填充来自A和(第一个 A)的位,获得以下内容: 。´11100100  10000110  10110100


然后我将生成的三个字节转换回十六进制值:E4 86 B4。


然而,当我尝试用代码编写它时,我得到了一个完全不同的字符。换句话说,我的解决方案没有按预期工作。


package main


import (

    "fmt"

)


func main() {

    r := "\xE4\x86\xB4"


    fmt.Println(r) // It wrote 䆴 instead of Á

}


不负相思意
浏览 136回答 2
2回答

小怪兽爱吃肉

看起来´您提供的 (U+00B4) 字符实际上并不是Unicode 定义的组合字符。>>> "A\u00b4" 'A´'如果我们改用◌́(U+0301),那么我们只需将它与一个字符按顺序放置A,就可以得到预期的输出:>>> "A\u0301" 'Á'除非我误解了你的意思,否则这里看起来不需要任何二进制操作或欺骗。

慕勒3428872

正如 StardustGogeta 在他们的回答中解释的那样,“尖音”口音的正确组合 unicode 字符是 U+0301(组合尖音)。但是在 Go 中,由单个 U+00C1(带尖音符的拉丁文大写字母 A)字符组成的字符串不等于由 U+0041(拉丁文大写字母 A)后跟 U+0301(组合尖音符)组成的字符串)如果要比较字符串,则需要将两者都规范化为相同的规范化形式。以下代码片段展示了如何做到这一点:package mainimport (    "fmt"    "golang.org/x/text/unicode/norm")func main() {    combined := "\u00c1"    combining := "A\u0301"    fmt.Printf("combined = %s, combining = %s\n", combined, combining)    fmt.Printf("combined == combining: %t\n", combined == combining)    combiningNormalised := string(norm.NFC.Bytes([]byte(combining)))    fmt.Printf("combined == combiningNormalised: %t\n", combined == combiningNormalised)}输出:combined = Á, combining = Ácombined == combining: falsecombined == combiningNormalised: true
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go