Domanda

Ho una variabile stringa. Devo convertire tutti i caratteri non cifri in spazi (""). Ho un problema con i caratteri Unicode. I caratteri Unicode (i caratteri al di fuori del chatset di base) vengono convertiti in alcuni caratteri non validi. Vedi il codice per esempio.

Esiste un altro modo su come ottenere lo stesso risultato con la procedura che non soffocerebbe su caratteri unicode speciali?

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.

Il risultato:

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
È stato utile?

Soluzione 2

Che ne dici invece di sostituire caratteri non numerici, però e tira fuori i personaggi numerici e ricostruisci Z? (Nota che la mia versione qui è pre CHAR. funzioni di stringa.)

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.

Altri suggerimenti

La funzione substr non deve essere utilizzata sul lato sinistro di un'espressione in modalità Unicode, poiché il carattere di sostituzione potrebbe non essere lo stesso numero di byte dei caratteri che vengono sostituiti. Invece, utilizzare la funzione Sostituisci sul lato destro.

I personaggi corrotti che stai vedendo sono dovuti a questa mancata corrispondenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top