Невозможно использовать символ Юникода в качестве руны

Похоже, что golang не поддерживает все символы юникода для своих рун.

package main

import "fmt"

func main() {
  standardSuits := []rune{'♠️', '♣️', '♥️', '♦️'}
  fmt.Println(standardSuits)
}

Выдает следующую ошибку:

./main.go:6: missing '
./main.go:6: invalid identifier character U+FE0F '️'
./main.go:6: syntax error: unexpected ️, expecting comma or }
./main.go:6: missing '
./main.go:6: invalid identifier character U+FE0F '️'
./main.go:6: missing '
./main.go:6: invalid identifier character U+FE0F '️'
./main.go:6: missing '
./main.go:6: invalid identifier character U+FE0F '️'
./main.go:6: missing '
./main.go:6: too many errors

Есть ли способ обойти это, или я должен просто жить с этим ограничением и использовать что-то еще?


person Electric Coffee    schedule 14.10.2016    source источник
comment
Если вы используете []rune{'♠', '♣', '♥', '♦'}, похоже, это работает. По-видимому, U + FE0F — это селектор вариантов, и, возможно, вам нужно разделить свой глиф на кодовые точки, из которых он состоит.   -  person Vatine    schedule 14.10.2016
comment
странно, как есть связанный селектор вариантов, неудивительно, что он глючит   -  person Electric Coffee    schedule 14.10.2016


Ответы (2)


Мне это кажется проблемой синтаксического анализа. Вы можете использовать точки Юникода для создания этих рун, что должно дать тот же результат, что и использование символов.

package main

import "fmt"

func main() {
  standardSuits := []rune{'\u2660', '\u2663', '\u2665', '\u2666', '⌘'}
  fmt.Println(standardSuits)
}

Генерирует

[9824 9827 9829 9830 8984]

Ссылка на игровую площадку: https://play.golang.org/p/jTLsbs7DM1

Я добавил дополнительную 5-ю руну, чтобы проверить, дает ли результат кодовой точки или символа то же самое. Похоже, это так.

Редактировать:

Не уверен, что не так с вашими символами (не просматривал их в шестнадцатеричном редакторе, нет под рукой), но что-то в них странное.

Я также получил это, скопировав символы из Википедии:

package main

import "fmt"

func main() {
  standardSuits := []rune{'♠', '♣', '♥', '♦'}
  fmt.Println(standardSuits)
}

https://play.golang.org/p/CKR0u2_IIB

person kratenko    schedule 14.10.2016

Строка Юникода, которую вы используете в своем исходном коде, состоит из более чем одного «символа», но символьная константа «...» не может содержать строки длины больше единицы. Более подробно:

Если я скопирую и вставлю ваш исходный код и распечатаю шестнадцатеричный дамп, я смогу увидеть точные байты в вашем исходном коде:

>>> hexdump -C x.go
00000000  70 61 63 6b 61 67 65 20  6d 61 69 6e 0a 0a 69 6d  |package main..im|
00000010  70 6f 72 74 20 22 66 6d  74 22 0a 0a 66 75 6e 63  |port "fmt"..func|
00000020  20 6d 61 69 6e 28 29 20  7b 0a 20 20 73 74 61 6e  | main() {.  stan|
00000030  64 61 72 64 53 75 69 74  73 20 3a 3d 20 5b 5d 72  |dardSuits := []r|
00000040  75 6e 65 7b 27 e2 99 a0  ef b8 8f 27 2c 20 27 e2  |une{'......', '.|
00000050  99 a3 ef b8 8f 27 2c 20  27 e2 99 a5 ef b8 8f 27  |.....', '......'|
00000060  2c 20 27 e2 99 a6 ef b8  8f 27 7d 0a 20 20 66 6d  |, '......'}.  fm|
00000070  74 2e 50 72 69 6e 74 6c  6e 28 73 74 61 6e 64 61  |t.Println(standa|
00000080  72 64 53 75 69 74 73 29  0a 7d 0a                 |rdSuits).}.|

Это показывает, например, что ваш '♠️' закодирован с использованием шестнадцатеричных байтов e2 99 a0 ef b8 8f. В кодировке utf-8 это соответствует двум(!) символам \u2660 \uFE0F. Глядя на код, это не очевидно, так как \uFE0F не является печатным символом, но Go жалуется, потому что у вас есть более одного символа в символьной константе. Вместо этого использование '♠' или '\u2660' работает, как и ожидалось.

person jochen    schedule 14.10.2016