为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
不负相思意 2023-03-15 15:40:26
我知道 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 mainimport (    "fmt")func main() {    r := "\xE4\x86\xB4"    fmt.Println(r) // It wrote 䆴 instead of Á}
查看完整描述

2 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

看起来´您提供的 (U+00B4) 字符实际上并不是Unicode 定义的组合字符。

>>> "A\u00b4"
'A´'

如果我们改用◌́(U+0301),那么我们只需将它与一个字符按顺序放置A,就可以得到预期的输出:

>>> "A\u0301"
'Á'

除非我误解了你的意思,否则这里看起来不需要任何二进制操作或欺骗。


查看完整回答
反对 回复 2023-03-15
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

正如 StardustGogeta 在他们的回答中解释的那样,“尖音”口音的正确组合 unicode 字符是 U+0301(组合尖音)。

但是在 Go 中,由单个 U+00C1(带尖音符的拉丁文大写字母 A)字符组成的字符串不等于由 U+0041(拉丁文大写字母 A)后跟 U+0301(组合尖音符)组成的字符串)

如果要比较字符串,则需要将两者都规范化为相同的规范化形式。

以下代码片段展示了如何做到这一点:

package main


import (

    "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: false

combined == combiningNormalised: true


查看完整回答
反对 回复 2023-03-15
  • 2 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信