我有一个字符串变量。我需要将所有非数字字符转换为空格(“”)。我有unicode字符的问题。 Unicode字符(基本字符集外部的字符)将转换为一些无效字符。例如,请参阅代码。
有没有其他方法如何使用不会阻塞特殊unicode字符的过程来实现相同的结果?
new file.
set unicode = yes.
show unicode.
data list free
/T (a10).
begin data
1234
5678
absd
12as
12(a
12(vi
12(vī
12āčž
end data.
string Z (a10).
comp Z = T.
loop #k = 1 to char.len(Z).
if ~range(char.sub(Z, #k, 1), "0", "9") sub(Z, #k, 1) = " ".
end loop.
comp Z = normalize(Z).
comp len = char.len(Z).
list var = all.
exe.
结果:
T Z len
1234 1234 4
5678 5678 4
absd 0
12as 12 2
12(a 12 2
12(vi 12 2
12(vī 12 � 6
>Warning # 649
>The first argument to the CHAR.SUBSTR function contains invalid characters.
>Command line: 1939 Current case: 8 Current splitfile group: 1
12āčž 12 �ž 7
Number of cases read: 8 Number of cases listed: 8
答案 0 :(得分:2)
在Unicode模式下,不应在表达式的左侧使用substr函数,因为替换字符可能与要替换的字符的字节数不同。相反,请使用右侧的替换功能。
您看到的损坏字符是由于此尺寸不匹配造成的。
答案 1 :(得分:1)
如何而不是替换非数字字符,循环并拉出数字字符并重建Z
? (注意我的版本是CHAR.
字符串函数。)
data list free
/T (a10).
begin data
1234
5678
absd
12as
12(a
12(vi
12(vī
12āčž
12as23
end data.
STRING Z (a10).
STRING #temp (A1).
COMPUTE #len = LENGTH(RTRIM(T)).
LOOP #i = 1 to #len.
COMPUTE #temp = SUBSTR(T,#i,1).
DO IF INDEX('0123456789',#temp) > 0.
COMPUTE Z = CONCAT(SUBSTR(Z,1,#i-1),#temp).
ELSE.
COMPUTE Z = CONCAT(SUBSTR(Z,1,#i-1)," ").
END IF.
END LOOP.
EXECUTE.