Frage

Ich habe eine String -Variable. Ich muss alle nicht stellenden Zeichen in Leerzeichen konvertieren (""). Ich habe ein Problem mit Unicode -Zeichen. Unicode -Zeichen (die Zeichen außerhalb des Basis -Charset) werden in einige ungültige Zeichen konvertiert. Siehe zum Beispiel den Code.

Gibt es andere Möglichkeiten, wie Sie dasselbe Ergebnis mit der Prozedur erzielen können, die nicht auf speziellen Unicode -Zeichen ersticken würde?

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.

Das Ergebnis:

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
War es hilfreich?

Lösung 2

Wie wäre es, anstatt nicht numerische Charaktere zu ersetzen, aber Sie zymen und ziehen die numerischen Zeichen heraus und bauen wieder auf Z? (Beachten Sie, dass meine Version hier PREE ist CHAR. String -Funktionen.)

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.

Andere Tipps

Die Substr -Funktion sollte nicht auf der linken Seite eines Ausdrucks im Unicode -Modus verwendet werden, da das Ersatzzeichen möglicherweise nicht die gleiche Anzahl von Bytes wie das ausgetaute Zeichen ist. Verwenden Sie stattdessen die Ersetzungsfunktion auf der rechten Seite.

Die korrupten Charaktere, die Sie sehen, sind auf diese Größenfehlanpassung zurückzuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top