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

在Julia lang中是否可以将字符串与大字符(UTF32String)连接起来?,julia,utf-32,Julia,Utf 32,构造UTF32字符串(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

构造UTF32字符串(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中字符表示法发生了变化,问题的答案取决于您使用的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
),最后,如果深入研究,这将调用
write(s::IO,ch::Char)
,witch
ch
等于
a
,如果您查看此方法的定义,您将看到对于
a
,它将生成
'\ufffd'
——这就是您得到的结果


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

的字符表示形式在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表示形式无效(无法映射较大的值)

朱莉娅0.6.2 在这里,您可以创建
a
b
c
,但问题是
b*c
相当于
string(b,c)
(因此,不管作为参数传递给它的是什么类型,它最终都会将其转换为
string
),最后,如果深入研究,这将调用
write(s::IO,ch::Char)
,witch
ch
等于
a
,如果您查看此方法的定义,您将看到对于
a
,它将生成
'\ufffd'
——这就是您得到的结果


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

的值,该值甚至不是有效的Unicode代码点。您试图对无效字符串进行操作有什么原因吗?哼,加密。我很好奇是否所有的2^32字符都可以使用。此外,我想知道这是否是程序解析文本时在一些文件上出现错误的原因?(当我将UTF16String更改为UTF32String时,解决了一个类似的错误。)如果您没有真正使用有效的文本数据,则应该使用类似于
向量{UInt32}
的内容。是否可以将数组保存到一个空间很小的文件中?可能是字符串文本的1.5*甚至2*?这甚至不是有效的Unicode代码点。您试图对无效字符串进行操作有什么原因吗?哼,加密。我很好奇是否所有的2^32字符都可以使用。此外,我想知道这是否是程序解析文本时在一些文件上出现错误的原因?(当我将UTF16String更改为UTF32String时,解决了一个类似的错误。)如果您没有真正使用有效的文本数据,则应该使用类似于
向量{UInt32}
的内容。是否可以将数组保存到一个空间很小的文件中?可能是字符串文本的1.5*甚至2*?可能266665个字符就足够了。剩下让我困惑的是log(226665)==18?是否有理由不使用剩余的(32-18)位?您将266665带到了哪里?在Julia 0.7中,您可以映射
2097151
字符,尽管只有
1114111
有效的Unicode字符。原因是UTF-8字符编码为
11110xxx100xxxxx100xxxxx100xxxxx100xxxxxx
(我将其简化了一点,以了解详细信息),其中
x
为0或1。由于您有21个
x
s,因此在Julia 0.7中最多可以映射到
2^21=2097152
字符。现在清楚了吗?也许266665个字符就够了。剩下让我困惑的是log(226665)==18?是否有理由不使用剩余的(32-18)位?您将266665带到了哪里?在Julia 0.7中,您可以映射
2097151
字符,尽管只有
1114111
有效的Unicode字符。原因是UTF-8字符编码为
11110xxx100xxxxx100xxxxx100xxxxx100xxxxxx
(我将其简化了一点,以了解详细信息),其中
x
为0或1。由于您有21个
x
s,因此在Julia 0.7中最多可以映射到
2^21=2097152
字符。现在清楚了吗?