Pergunta

Eu tenho uma variável de string. Preciso converter todos os caracteres que não são de dígitos em espaços (""). Eu tenho um problema com os caracteres Unicode. Os caracteres Unicode (os caracteres fora do charset básico) são convertidos em alguns caracteres inválidos. Veja o código, por exemplo.

Existe alguma outra maneira de alcançar o mesmo resultado com o procedimento que não sufocaria os caracteres Unicode especiais?

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.

O resultado:

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
Foi útil?

Solução 2

Que tal, em vez de substituir caracteres não numéricos, você pedalará e retira os personagens numéricos e a reconstrução Z? (Observe que minha versão aqui é pré CHAR. funções de string.)

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.

Outras dicas

A função de substrato não deve ser usada no lado esquerdo de uma expressão no modo Unicode, porque o caractere de substituição pode não ser o mesmo número de bytes que os caracteres que estão sendo substituídos. Em vez disso, use a função de substituição no lado direito.

Os caracteres corrompidos que você está vendo são devido a esse tamanho de incompatibilidade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top