Closed MineCake147E closed 12 months ago
現行の関数の動作は修正したほうが良いかもです
ユニコード非対応の関数を提供する必要があるのかというところですね
あとは糖衣構文的な便利な組み込み関数を組み込み機能として入れるのかという部分も検討されるべきです
Unicodeについてあまりよく分かっていないのですが、例えば"👉🏿"はUnicodeのコードポイントでは一つの数字で表せるのですか?
str.codepoint_at
は僕のミスですね
似た名前のメソッドがあっても混乱するだろうし、str.unicode_codepoint_at
をstr.codepoint_at
に改名したほうが良さそう?
もし改名するなら、str.charcode_at
も追加したほうが良さそうかな
例えば"👉🏿"はUnicodeのコードポイントでは一つの数字で表せるのですか?
"👉🏿"は内部的には2文字です。U+1F449 WHITE RIGHT POINTING BACKHAND INDEX
の後ろにU+1F3FF EMOJI MODIFIER FITZPATRICK TYPE-6
が続いており、これらが一文字であるように表示されています。
また、"👨👦"は内部的には3文字です。(U+1F468 MAN
+ U+200D ZERO WIDTH JOINER
+ U+1F466 BOY
)
このように、複数文字のシーケンスを一文字として表示する「書記素クラスタ」(Grapheme Cluster)という概念がUnicodeには存在します。
現行の関数の動作は修正したほうが良いかもです
現行ドキュメントとの矛盾を解決することを優先するならそれが良いと思います。
あとは糖衣構文的な便利な組み込み関数を組み込み機能として入れるのかという部分も検討されるべきです
恐らくstr.to_unicode_codepoint_arr()
等についてのご意見だと思われますが、個人的にはMisskey Playのように実行速度制限がかかる状況においてAiScriptでやることは可能な限り減らしたいです。
Math
内の関数の殆どがネイティブ実装されているのも同様の利点があると思います。
現行の関数の動作は修正したほうが良いかもです str.unicode_codepoint_atをstr.codepoint_atに改名したほうが良さそう?
賛成です。
to_arrは書記素クラスタ単位での分割を行う関数にしてほしいです。よりシンプルな名前の機能はより直観的であるべきです。 stringzに似た名前の関数があるので、それを利用するようにお願いします。
to_arrは書記素クラスタ単位での分割を行う関数にしてほしいです。よりシンプルな名前の機能はより直観的であるべきです。
同様の機能はsplit()
で既に存在しますが、確かにsplit()
では分かりづらいかもしれませんね。
https://github.com/MineCake147E/aiscript/pull/1
@marihachi @saki-lere @syuilo 異論ある方はいますか?
@syuilo @saki-lere 認識合わせのため https://github.com/MineCake147E/aiscript/pull/1 について説明を加えておくと、
用語
U+XXXX
の形式で表される現状
str.codepoint_at
はサロゲートペアを分割してカウントするため、'👉'などの文字が崩れてしまう。str.codepoint_at
は書記素クラスタも分割するが、これに関しては「コードポイントに変換する」という機能上どうしようもないhttps://github.com/aiscript-dev/aiscript/pull/486
str.codepoint_at
は現状のまま保存。str.unicode_codepoint_at
を追加。https://github.com/MineCake147E/aiscript/pull/1 ( #486 へのPR )
str.codepoint_at
の現状の挙動をバグとみなし、サロゲートペアを分割しないように修正。str.codepoint_at
と同様の挙動をするstr.charcode_at
を追加。とりあえずこの2つのどちらを選ぶか決めたい感じです。
概要
https://github.com/aiscript-dev/aiscript/pull/313 で
str.codepoint_at
が追加されましたが、何故かcharCodeAt()を呼び出しており、UTF-16の上位サロゲートをそのまま返してしまいます。 https://github.com/aiscript-dev/aiscript/blob/537fa96b3990fe55a7bebd1864f12ac87144b876/src/interpreter/primitive-props.ts#L77-L82 他、Unicodeコードポイントによる文字位置指定が現状できないことから、 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/@@iterator と同じことがAiScriptでも出来るようになったらいいなと思いました。 また、他にもいくつかの関数を提案します。提案関数
str.unicode_codepoint_at(index)
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt
str.codepoint_at
とは違い、index
の位置の要素が UTF-16の上位サロゲートであった場合、そのサロゲートペアのコードポイントを返す。戻り値は
num
。str.to_arr()
AiScriptの
str.split()
と同じ挙動をする。 書記素クラスタは保持される。戻り値は
str
の配列。str.to_unicode_arr()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/@@iterator と同じ挙動をする。 書記素クラスタは分割されるが、サロゲートペアは保持される。
戻り値は
str
の配列。str.to_unicode_codepoint_arr()
戻り値は
num
の配列。str.to_char_arr()
JavaScriptの
string.split("")
と同じ挙動をする。 サロゲートペアは分割される。 ※AiScriptのstr.split("")
でもサロゲートペアは分割されるstr.to_charcode_arr()
str.codepoint_at
をすべての文字に対して実行し、数値の配列を返す。 サロゲートペアは分割される。str.to_utf8_byte_arr()
文字列をUTF-8のバイト毎に分割し、数値の配列を返す。
Str:from_unicode_codepoints(array)
Str:from_utf8_bytes(array)
num
のarr
を受け取り、UTF-8をデコードして文字列を作成する。