*jconsole の Windows 版では REPL でユニコードを利用できません。*この記事は JQt / JAndroid の使用を前提にしています。
ユニコード
ユニコードは、世界中の全ての文字に番号 (コードポイント) を割り当てて、ロケールや OS に依存しない 一つの文字集合を定めたものです。
J では、文字列はユニコードを用いて表現されますが、3 種類のエンコーディングがサポートされています。一つのコードポイントを何バイトで表すかが異なります。
エンコーディング | バイト / コードポイント |
---|---|
UTF-8 | 1-4 (可変長) |
UTF-16 | 2 (サロゲートペア 1 : 4) |
UTF-32 | 4 |
リテラル (UTF-8)
文字列リテラルの型は、literal です。
datatype'abcde'
literal
文字列リテラルには、ASCII 範囲外の文字も含むことができます。文字は UTF-8 でエンコードされます 2。
#'あ' NB. 'あ' は 3 バイト
3
a. i. 'あ'
227 129 130
'寿司🍣'
寿司🍣
文字列 (literal) の長さはバイト数で数えるので、「1 文字」の つもりでも 2 バイト以上の文字ならリストになります。
$'a' NB. 文字 (atom)
$'あ' NB. 文字列 (list)
3
literal は、正確には文字列ではなくバイト列を表すので、任意のバイナリデータを格納できます。そのため、値の範囲 (精度) に言及する場合は、byte と呼ぶことがあります。
UTF-16
u:
(monad) を使うと、UTF-16 の文字列を生成できます。UTF-16 文字列の型は unicode です。
NB. A(U+0041) あ(U+3042)
a=: u:16b0041 16b3042
a
Aあ
#a
2
datatype a
unicode
一部の漢字や絵文字を表すには、サロゲートペアを使います。
u:16bd842 16bdfb7 NB. U+20BB7
𠮷
#u:16bd842 16bdfb7
2
UTF-32
u:
(dyad) を使うと、UTF-32 へ変換することができます。型は unicode4 です。
a=. 10 u: 16b0041 16b3042 16b20bb7
a
Aあ𠮷
#a
3
datatype a
unicode4
コードポイント単位で文字を扱いたい場合に便利です。
相互変換
UTF-8, UTF-16, UTF-32 およびコードポイントの数値は、相互変換が可能です。変換には、前述の u:
(dyad) を使います。
x u: y
と書いたとき、x
の値によって変換の種類が変わります。
x |
y |
変換後 |
---|---|---|
2 | UTF-8 | UTF-16 | UTF-32 | UTF-16 |
3 | UTF-8 | UTF-16 | UTF-32 | integer |
4 | integer [16b_10000, 16bffff] | UTF-16 |
8 | UTF-8 | UTF-16 | UTF-32 | integer [0, 16b10ffff] | UTF-8 |
10 | UTF-8 | UTF-16 | UTF-32 | integer [0, 16b10ffff] | UTF-32 |
ちなみに、monad の u: y
は、
-
y
が数値のとき4 u: y
- それ以外の場合
2 u: y
と同じ変換になります。
[ 前 : 数学関数 ] [ 目次 ] [ 次 : シンボル ]