Open3

文字エンコーディングについて

aiiroIndyaiiroIndy

経緯

Verse言語リファレンスの文字エンコーディングの内容がわからないので 使ってみよう。
https://dev.epicgames.com/documentation/ja-jp/uefn/strings-in-verse

1. 文字「a」,「1」の16進数、10進数、8進数を調べる

https://www.curict.com/reference/ascii/
文字「a」の場合、 16進数(0x61) - 10進数(97) - 8進数(141)
文字「1」の場合、 16進数(0x31) - 10進数(49) - 8進数(061)

2. 16進数、10進数、8進数を使ってプログラムを書いてみる

character_encoding_sample
using { /Fortnite.com/Devices }
character_encoding_sample := class(creative_device):

    OnBegin<override>():void=
        #文字「a」:  16進数(0x61) - 10進数(97) - 8進数(141)
        #UTF-8(61)
        Alphabet_1:char = 'a'       #出力結果: "a" ……(a)
        Alphabet_2:char = 0o61      #出力結果: "a" ……(b)
        Alphabet_3:int = 0x61       #出力結果: "97" ……(c)
        Alphabet_4:int = 0141       #出力結果: "97" ……(d)
        Alphabet_5:string = "{0x61}" #出力結果: "97" ……(e)  ToString(Val:int)
        Alphabet_6:string = "{97}"   #出力結果: "97" ……(f)  ToString(Val:int)
        Alphabet_7:string = "{0o61}" #出力結果: "a"  ……(g)  ToString(Character:char)
        Alphabet_8:string = "{0141}" #出力結果: "97" ……(h)  ToString(Val:int)
   
        #文字「1」: 16進数(0x31) - 10進数(49) - 8進数(061)
        #UTF-8(31)
        Number_1:char = '1'         #出力結果: "1"  ……(a)
        Number_2:char = 0o31        #出力結果: "1"  ……(b)
        Number_3:int = 0x31         #出力結果: "49" ……(c)
        Number_4:int = 0061         #出力結果: "49" ……(d)
        Number_5:string = "{0x31}"   #出力結果: "49" ……(e)   ToString(Val:int)
        Number_6:string = "{49}"     #出力結果: "49" ……(f)   ToString(Val:int)
        Number_7:string = "{0o31}"   #出力結果: "1"  ……(g)   ToString(Character:char)
        Number_8:string = "{0061}"   #出力結果: "49" ……(h)   ToString(Val:int)



[Output Log]

[2024.09.04-02.27.29:343][782]LogVerse: : Alphabet: 1=a, 2=a, 3=97, 4=97, 5=97, 6=97, 7=a, 8=97
[2024.09.04-02.27.29:343][782]LogVerse: : Number:   1=1, 2=1, 3=49, 4=49, 5=49, 6=49, 7=1, 8=49


3. 考察

# 1文字をシングルクォーテーションで囲ってchar型に代入可能(※1)。表示する値は文字   (a)
# 1文字の10進数をstring型で扱う場合、表示する値は10進数になる                    (f)
# 1文字の16進数(0xXX)はint型に代入可能。表示する値は10進数になる                 (c, e)
# 1文字の16進数の先頭0xを0oに変更するとchar型に代入可能(※2)。表示する値は文字    (b, g)
# 1文字の8進数はint型に代入可能。表示する値は10進数になる                        (d, h)
# ※1 構文エラーとなる場合もある。(例)'a'の代入はOKだが、'あ'の代入は構文エラー。
# ※2 char型の対応形式は0oXX。

16進数をもとに対応する1文字を表示したり、8進数をもとに対応する10進数の値を表示できそう。

aiiroIndyaiiroIndy
#文字「あ」:  UTF-8(e38182)
# https://www.seiai.ed.jp/sys/text/java/utf8table.html
Kana_1:char32 = 'あ'            #出力結果: ※char32はToStringがないため、Print不可
Kana_2:char32 = 0u38182         #出力結果: ※char32はToStringがないなめ、Print不可
Kana_3:int = 0xe38182           #出力結果: "14909826" 
Kana_4:string = "{0xe38182}"    #出力結果: "14909826" ToString(Val:int)

#文字「🐈」: #Unicode(1f408)
# https://www.emojiall.com/ja
Emoji_1:char32 = '🐈'           #出力結果: ※char32はToStringがないため、Print不可
Emoji_2:char32 = 0u1f408        #出力結果: ※char32はToStringがないなめ、Print不可
Emoji_3:int = 0x1f408           #出力結果: "128008"
Emoji_4:string = "{0x1f408}"    #出力結果: "128008" ToString(Val:int)

Print("Kana: 3={Kana_3}, 4={Kana_4}")
Print("Emoji: 3={Emoji_3}, 5={Emoji_4}")


[Output Log]

LogVerse: : Kana: 3=14909826, 4=14909826
LogVerse: : Emoji: 3=128008, 5=128008