Длина строки, содержащей символы CJK

testPrefs = JSON.stringify({
            'val': 10
        });
    var jsonfile = {};
    jsonfile[key] = testPrefs;
    chrome.storage.sync.set(jsonfile, function () {
        console.log('Saved', key, testPrefs)
2
задан Flux 9 March 2019 в 16:25
поделиться

2 ответа

Как указано в комментариях, OCaml не имеет встроенной поддержки для какого-либо конкретного кодирования, поэтому длина равна количеству байтов.

Теперь, если вы используете кодировку Utf8 (это самый простой способ смешать ascii и CJK AFAIK), есть несколько способов вычислить этот размер.

Например, используя очень легкую библиотеку Uutf [EDIT], как указывает октахрон, это возвращает длину в скалярных значениях, а не в символах, вы должны использовать ответ октахрона.

let utf8_length s = (* returns the number of unicode scalar values *)
 let decoder = Uutf.decoder ~encoding:`UTF_8 (`String s) in
 let rec loop () = match Uutf.decode decoder with | `End -> () | _ -> loop () in
 loop ();
 Uutf.decoder_count decoder
0
ответ дан PatJ 9 March 2019 в 16:25
поделиться

Если вы хотите посчитать количество кластеров расширенных графем (или графических символов), вы можете использовать Uuseg для выполнения сегментации:

let len = Uuseg_string.fold_utf_8 `Grapheme_cluster (fun x _ -> x + 1) 0
;; len "春"

1

, преимущество которого заключается в том, что он по-прежнему точен в присутствии непредставленных символов, таких как разложенный джамо по-корейски:

 ;; len "\u{1112}\u{1161}\u{11AB}"

1

, что правильный результат, так как предыдущие строки должны отображаться как , даже если он записан с 3 скалярными значениями Unicode.

0
ответ дан octachron 9 March 2019 в 16:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: