构造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
在Julia 0.4和0.6上执行此操作会产生相同的结果。是否可以通过大型Chars对字符串进行操作?
答案 0 :(得分:2)
鉴于0.7中的字符表示有变化,问题的答案取决于您使用的Julia版本。
如果您想使用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
,尽管它是无效的(最大有效Unicode是0x0010ffff
)。
这是一个你必须在0.7中记住的问题。
原因是最多0x001fffff
的值可以映射到UTF-8,尽管其中一些UTF-8表示无效(较大的值无法映射)。
您可以在此处创建a
,b
和c
,但问题是b*c
等同于string(b, c)
(因此会转换它)到最后String
没有关系你作为参数传递给它的类型,最后,如果你挖得足够深,这将调用write(s::IO, ch::Char)
,女巫ch
等于{{ 1}},如果你看一下这个方法的定义,你会发现a
会产生a
- 这就是你得到的。
Julia 0.6.2将为所有无效的Unicode发出'\ufffd'
,即大于'\ufffd'
。