Julia : 中文字符串的取值 UnicodeError 及解决方案

时间:2021-07-17 07:46:37

在Julia中,对于Unicode字符串的取值,可能不小心就是一个坑。
感谢@Gnimuc ,提供以下链接,可以做为参考。
http://*.com/questions/39501900/truncate-string-in-julia

一、问题及提出

julia> strs ="#我是中国人"
"#我是中国人"

julia> strs[1:1]
"#"

julia> strs[2:2]
"我"

julia> strs[3:3]
ERROR: UnicodeError: invalid character index
in getindex(::String, ::UnitRange{Int64}) at .\strings\string.jl:130

julia> strs[4:4]
ERROR: UnicodeError: invalid character index
in getindex(::String, ::UnitRange{Int64}) at .\strings\string.jl:130

julia> length(strs)
6

二、思路
如果取到类似strs[3:3]的值,有什么办法? 先由字符串=>字符数组…….?

julia> data =collect(take(strs,length(strs)))
6-element Array{Char,1}:
'#'
'我'
'是'
'中'
'国'
'人'
julia> data2= Vector{Char}(strs) # 这是一种替代的方式
6-element Array{Char,1}:
'#'
'我'
'是'
'中'
'国'
'人'

julia> str =string(data[2:4])
"['我','是','中']"

julia> str =string(data[4])
"中"

julia> str =String(data[2:4]) # 建议方案,String pk string
"我是中"

julia> str =string(data[2:4]...)# 替代方案
"我是中"

julia> str =String(data[1:2])
"#我"

julia> str =String(data[2:2])
"我"

三、 优化方案

现在封装成自定义函数:


julia> getstrs(strs::String) =collect(take(strs,length(strs)))
getstrs (generic function with 1 method)

julia> getindexstrs(strs::String,n,m) =String(getstrs(strs)[n:m]) # String !
getindexstrs (generic function with 1 method)

julia> getindexstrs(strs::String,n) =getindexstrs(strs,n,n)
getindexstrs (generic function with 2 method)

效率优化

function stringindex(strs::String,n,m)
if isascii(strs)
return strs[n:m]
else
return getindexstrs(strs,n,m)
end
end
stringindex(strs,n) =stringindex(strs,n,n);

四、测试

julia> getindexstrs(strs,1,3)
"#我是"

julia> getindexstrs(strs,1,1)
"#"

julia> getindexstrs(strs,3,3)
"是"

julia> getindexstrs(strs,2,4)
"我是中"

julia> getindexstrs(strs,5)
"国"

julia> getindexstrs(strs,4)
"中"

julia> getindexstrs(strs,3)
"是"

julia> stringindex("Q我是中国人",1,5) #isascii ->false
"Q我是中国"

julia> stringindex("Qabscdsd",2,3) # isascii->true
"ab"

可能还有其它的方式(包括形式和性能都可能不一,如Vector{Char}(strs)),但是这个方式相对比较简单,容易理解。