문제

문자열 변수가 있습니다. 모든 비 독점 문자를 공백으로 변환해야합니다 ( ""). 유니 코드 문자에 문제가 있습니다. 유니 코드 문자 (기본 숯 외부의 문자)는 유효하지 않은 문자로 변환됩니다. 예를 들어 코드를 참조하십시오.

특수 유니 코드 문자를 질식시키지 않는 절차로 동일한 결과를 달성하는 방법이 있습니까?

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.

다른 팁

대체 문자는 문자가 교체되는 것과 같은 수의 바이트가 아닐 수 있기 때문에 유니 코드 모드에서 표현식의 왼쪽에서 기판 함수를 사용해서는 안됩니다. 대신 오른쪽의 교체 기능을 사용하십시오.

당신이보고있는 손상된 캐릭터는이 크기의 불일치 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top