0

构造 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 上执行此操作会产生相同的结果。是否有可能解决对带有大字符的字符串进行操作?

4

1 回答 1

2

鉴于 0.7 中的 char 表示形式发生了变化,问题的答案取决于您使用的 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 表示是无效的(无法映射更大的值)。

朱莉娅 0.6.2

在这里你可以创建a, b, 和c,但问题是它b*c等价于string(b, c)(因此无论String你作为参数传递给它的是什么类型,它最终都会将其转换为),最后,如果你挖得足够深,这将call write(s::IO, ch::Char),witch chequal to a,如果你看一下这个方法的定义,你会看到a它会产生'\ufffd'——这就是你得到的。

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

于 2018-01-18T22:38:20.017 回答