是否有可能在Julia-lang中将字符串与大字符(UTF32String)连接起来?

时间:2018-01-18 10:00:21

标签: julia utf-32

构造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对字符串进行操作?

1 个答案:

答案 0 :(得分:2)

鉴于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,尽管它是无效的(最大有效Unicode是0x0010ffff)。 这是一个你必须在0.7中记住的问题。

原因是最多0x001fffff的值可以映射到UTF-8,尽管其中一些UTF-8表示无效(较大的值无法映射)。

Julia 0.6.2

您可以在此处创建abc,但问题是b*c等同于string(b, c)(因此会转换它)到最后String没有关系你作为参数传递给它的类型,最后,如果你挖得足够深,这将调用write(s::IO, ch::Char),女巫ch等于{{ 1}},如果你看一下这个方法的定义,你会发现a会产生a - 这就是你得到的。

Julia 0.6.2将为所有无效的Unicode发出'\ufffd',即大于'\ufffd'