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

在Julia中,对于Unicode字符串的取值,可能不小心就是一个坑。
感谢@Gnimuc ,提供以下链接,可以做为参考。
http://stackoverflow.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)),但是这个方式相对比较简单,容易理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值