Можно ли объединить строки с большими символами (UTF32String) в Julia-lang?

Создайте UTF32String (b,c), где b содержит большое значение:

using LegacyStrings
a=Char(69058047)
b=UTF32String(a)
c=UTF32String("")

Теперь объедините b и c в d:

d=b*c

Прочитайте b, c, d соответственно. b сохранил свое значение, но d был принудительно преобразован ниже 2^16, напечатан как UTF8String, а его значение потеряно?

julia> typeof(d)
UTF8String

julia> typeof(b)
UTF32String

julia> typeof(c)
UTF32String

julia> D=Int(Char(d[1]))
65533

julia> B=Int(Char(b[1]))
69058047

Делая это на Юлии 0,4 и 0,6 дали тот же результат. Можно ли обойти работу на струнах с большими символами?

1 ответ

Решение

Учитывая, что в представлении char происходит изменение в 0.7, ответ на вопрос зависит от используемой вами версии Julia.

Юлия 0,7

Если вы хотите использовать Julia 0.7 (и, вероятно, именно на это вы должны нацеливаться, так как в конечном итоге вам все равно придется переключиться на нее), вы получите:

julia> a=Char(69058047)
ERROR: Base.CodePointError(0x041dbdff)
Stacktrace:
 [1] code_point_err(::UInt32) at .\char.jl:10
 [2] Type at .\char.jl:42 [inlined]
 [3] Char(::Int64) at .\boot.jl:682
 [4] top-level scope

Короче говоря - вы не сможете создать его вообще.

Важно знать, что значение границы для броска ошибки преобразования 0x001fffff хотя это недопустимо (максимально допустимый юникод 0x0010ffff). Это уловка, которую вы просто должны запомнить в 0,7.

Причина в том, что значения до 0x001fffff может быть сопоставлен с UTF-8, хотя некоторые из этих представлений UTF-8 являются недействительными (большие значения невозможно отобразить).

Юлия 0.6.2

Здесь вы можете создать a, b, а также c, но проблема в том, что b*c эквивалентно string(b, c) (таким образом, он преобразует его в String в конце концов, не важно, какой тип вы передадите ему в качестве аргумента) и, в конце концов, если вы будете копать достаточно глубоко, это вызовет write(s::IO, ch::Char)ведьма ch равно aи если вы посмотрите на определение этого метода, вы увидите, что для a это произведет '\ufffd' - и это то, что вы получаете.

Юлия 0.6.2 будет излучать '\ufffd' для всех недопустимых Unicode, т.е. больше, чем 0x0010ffff,

Другие вопросы по тегам