是否可以在 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
这里可以创建a
、b
、c
,但问题是b*c
等价于string(b, c)
(因此会最后将它转换为 String
,无论你将什么类型作为参数传递给它)最后,如果你挖掘得足够深,这将调用 write(s::IO, ch::Char)
、 ch
等于 a
,如果您查看此方法的定义,您会发现对于 a
它将产生 '\ufffd'
- 这就是您得到的结果。
Julia 0.6.2 将为所有无效的 Unicode 发出 '\ufffd'
,即任何大于 0x0010ffff
.
的值
构造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
这里可以创建a
、b
、c
,但问题是b*c
等价于string(b, c)
(因此会最后将它转换为 String
,无论你将什么类型作为参数传递给它)最后,如果你挖掘得足够深,这将调用 write(s::IO, ch::Char)
、 ch
等于 a
,如果您查看此方法的定义,您会发现对于 a
它将产生 '\ufffd'
- 这就是您得到的结果。
Julia 0.6.2 将为所有无效的 Unicode 发出 '\ufffd'
,即任何大于 0x0010ffff
.