Pregunta

Tengo una variable de cadena. Necesito convertir todos los caracteres no dígitos a espacios (""). Tengo un problema con los caracteres Unicode. Los caracteres Unicode (los caracteres fuera del charset básico) se convierten en algunos caracteres no válidos. Vea el código por ejemplo.

¿Hay alguna otra forma de lograr el mismo resultado con el procedimiento que no se ahogaría en caracteres unicode especiales?

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.

El 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
¿Fue útil?

Solución 2

¿Qué tal en lugar de reemplazar los personajes no numéricos, sin embargo, eliminas los personajes numéricos y la reconstrucción? Z? (Tenga en cuenta que mi versión aquí es pre CHAR. Funciones de cadena.)

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.

Otros consejos

La función subStr no debe usarse en el lado izquierdo de una expresión en modo unicode, porque el carácter de reemplazo puede no ser el mismo número de bytes que los carácter (s) reemplazados. En su lugar, use la función de reemplazo en el lado derecho.

Los personajes corruptos que estás viendo se deben a este tamaño de desajuste.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top