2

golang はそのルーン文字ですべての Unicode 文字をサポートしていないようです

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

これを回避する方法はありますか、それともこの制限に耐えて別のものを使用する必要がありますか?

4

2 に答える 2

5

解析の問題のように見えます。Unicode ポイントを使用してそのルーン文字を生成できます。これにより、文字を使用した場合と同じ結果が得られます。

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番目のルーンを追加しました。そうみたいですね。

編集:

文字の何が問題なのかわかりませんが (16 進エディターでそれらを表示していないか、周りに何もありません)、何かがおかしいです。

ウィキペディアから文字をコピーして貼り付けることで、これを実行することもできました。

package main

import "fmt"

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

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

于 2016-10-14T09:35:01.557 に答える
2

ソース コードで使用する Unicode 文字列は複数の「文字」で構成されていますが、文字定数 '...' に 1 を超える長さの文字列を含めることはできません。さらに詳細に:

ソース コードをコピーして貼り付け、16 進ダンプを出力すると、ソース コードの正確なバイト数を確認できます。

>>> 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).}.|

これは、たとえば、 が'♠️'16 進バイトを使用してエンコードされていることを示していますe2 99 a0 ef b8 8f。utf-8 エンコーディングでは、これは 2 つの (!) 文字に対応し\u2660 \uFE0Fます。は印刷可能な文字ではないため、コードを見てもこれは明らかではありません\uFE0Fが、文字定数に複数の文字があるため、Go は文句を言います。'♠'or'\u2660'を代わりに使用すると、期待どおりに機能します。

于 2016-10-14T17:55:05.617 に答える