是否可以在 Julia-lang 中将字符串与大字符(UTF 32 字符串)连接起来?

Is it possible to concatenate strings with large Chars(UTF32String) in 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

在 Julia 0.4 和 0.6 上执行此操作产生了相同的结果。是否可以解决对具有大字符的字符串进行操作的问题?

鉴于 0.7 中的 char 表示形式发生了变化,问题的答案取决于您使用的 Julia 版本。

茱莉亚 0.7

如果你想使用 Julia 0.7(这可能是你应该瞄准的目标,因为在长 运行 中你必须 s 无论如何)你会得到:

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 表示无效(无法映射更大的值)。

茱莉亚 0.6.2

这里可以创建abc,但问题是b*c等价于string(b, c)(因此会最后将它转换为 String,无论你将什么类型作为参数传递给它)最后,如果你挖掘得足够深,这将调用 write(s::IO, ch::Char)ch 等于 a,如果您查看此方法的定义,您会发现对于 a 它将产生 '\ufffd' - 这就是您得到的结果。

Julia 0.6.2 将为所有无效的 Unicode 发出 '\ufffd',即任何大于 0x0010ffff.

的值