Я знаю, что кодовая точка Юникода для Á
— это U+00C1
. Я читал в Интернете и на многих форумах и в статьях, что я также могу сделать Á
, комбинируя символы ´
(юникод: U+00B4
) и A
(юникод: U+0041
).
Мой вопрос прост. Как это сделать? Я пробовал что-то вроде этого. Я решил попробовать это на golang, но прекрасно, если кто-то знает, как это сделать на python (или на каком-то другом языке программирования). Это не имеет значения для меня.
Хорошо, поэтому я попробовал дальше.
A
в двоичном формате: 01000001
´
в двоичном формате: 10110100
Вместе это занимает 15 бит, поэтому мне нужен формат UTF-8 3 байта (1110xxxx 10xxxxxx 10xxxxxx
)
Заполнив биты из A
и ´
(первый A) вместо x, получится следующее: 11100100 10000110 10110100
.
Затем я преобразовал полученные три байта обратно в шестнадцатеричные значения: E4 86 B4
.
Однако, когда я попытался написать это в коде, у меня получился совсем другой персонаж. Другими словами, мое решение работает не так, как я ожидал.
package main
import (
"fmt"
)
func main() {
r := "\xE4\x86\xB4"
fmt.Println(r) // It wrote 䆴 instead of Á
}
Похоже, что предоставленный вами символ ´
(U+00B4) на самом деле не является комбинированным символом, как его определяет Unicode.
>>> "A\u00b4"
'A´'
Если вместо этого мы используем ◌́
(U+0301), то мы можем просто поместить его в последовательность с таким символом, как A
, и получить ожидаемый результат:
>>> "A\u0301"
'Á'
Если я не понимаю, что вы имеете в виду, не похоже, что здесь нужны какие-либо бинарные манипуляции или хитрости.
Как объясняет StardustGogeta в своем ответе, правильным комбинированным символом Unicode для «острого» акцента является U + 0301 (Combining Acute Accent).
Но в Go строка, состоящая из одного символа U+00C1 (латинская заглавная буква A с острым ударением), не равна строке, состоящей из U+0041 (латинская заглавная буква A), за которой следует U+0301 (сочетание острого ударения). )
Если вы хотите сравнить строки, вам нужно нормализовать их к одной и той же форме нормализации. Подробнее см. в записи блога Нормализация текста в Go.
В следующем фрагменте кода показано, как это сделать:
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
Спасибо! Ну, я сделал это более сложным, чем это есть на самом деле.