Вопрос

У меня есть строковая переменная. Мне нужно преобразовать все ненужные символы в пространства (""). У меня проблема с символами Unicode. Символы Unicode (символы вне основного Charset) преобразуются в некоторые недопустимые символы. См. Код, например.

Есть ли какой -либо другой способ достичь того же результата с помощью процедуры, которая не задыхалась бы от специальных символов 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
Это было полезно?

Решение 2

Как насчет того, чтобы заменить нецелевые символы, вы ездите на велосипеде и вытаскиваете числовые символы и перестроить 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.

Другие советы

Функция substr не должна использоваться в левой стороне выражения в режиме Unicode, поскольку символ замены может быть не таким же количеством байтов, как заменяемый символ (ы). Вместо этого используйте функцию «Заменить» в правой стороне.

Поврежденные персонажи, которых вы видите, связаны с несоответствием этого размера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top