在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)),但是这个方式相对比较简单,容易理解。