Можно ли объединить строки с большими символами (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
,