sed
다음과 같이 실행하고 콘솔에 인쇄 하면 모든 것이 정상입니다.
sed '/Q/{
s/Q//g
r /Users/ericbrotto/Desktop/question.txt
}' Commision.txt
하지만 이렇게 하고 ta 파일을 출력하면 다음과 같습니다.
sed '/Q/{
s/Q//g
r /Users/ericbrotto/Desktop/question.txt
}' Commision.txt > newFile
...내 새 문자열(이전 출력에서 올바르게 대체된 문자열)은 이제 아시아(북경어라고 믿습니다) 문자 묶음으로 읽혀집니다.
어떤 아이디어가 있나요?
후속 질문입니다내 이전 질문.
답변1
이전에 ASCII로 인코딩된 텍스트(또는 이와 동등하게 UTF-8로 인코딩된 ASCII 텍스트)를 UTF-16으로 디코딩하면 "한자"(UTF로 디코딩할지 여부에 따라 다른 문자)가 표시되는 경우가 많다는 것을 알고 있습니다. -16BE 또는 UTF-16LE). 이를 바탕으로 혼합 인코딩을 다루고 있다고 생각합니다. 내 생각에는 일반 ASCII(또는 UTF-8로 인코딩된 ASCII) Commision.txt
인 UTF-16BE 또는 UTF-16LE로 인코딩되어 question.txt
결국 newFile
두 파일 모두에 대해 잘못된 인코딩 조합이 되는 것 같습니다.
두 파일 모두에서 동일한 인코딩을 사용하면 상황이 더 좋아질 것입니다. 아마도 UTF-8이 가장 잘 작동할 것입니다. 최종 출력이 다른 인코딩으로 필요하면 다음을 사용할 수 있습니다.상변환( iconv -f UTF-8 -t UTF-16BE <newFile >newfile.utf16be.txt
)합니다.
실제로 ASCII 문자의 UTF-16 인코딩은 ASCII 인코딩과 동일하지만 추가 NUL 문자가 각 ASCII 문자 사이에 삽입되고 또 다른 NUL이 전체 문자 앞이나 뒤에 삽입됩니다(UTF-16 인코딩에 따라 다름). 캐릭터의 섹션 순서). 이는 UTF-8 또는 UTF-16으로 인코딩된 ASCII 텍스트가 UTF-8 터미널에서 직접 볼 때(즉, "콘솔에 인쇄된") "정상"으로 보인다는 것을 의미합니다.
파일 내용이 독립적으로 유지되는 한 모든 인코딩 감지 보기 환경(예: 편집기)은 인코딩을 올바르게 감지할 가능성이 높습니다(또는 UTF-8 및 많은 단일 바이트 인코딩이 동일) ASCII 범위 내에서).
근데 너가 갖고 있잖아sed파일을 함께 섞으세요. 안타깝게도,sed두 가지 다른 텍스트 인코딩을 사용하여 파일을 처리하고 있다는 것을 인식할 만큼 "지능적"이지 않습니다. 내 추측으로는 대부분 UTF-16으로 인코딩된 파일(from) Commision.txt
이 되고 중간(from)(또는 어디에 두든) UTF-8로 인코딩된 부분이 있게 됩니다 . 완전히 UTF-8로 디코딩된 경우 결과가 유효하지 않을 수 있지만 UTF-16으로 완전히 디코딩된 경우에는 유효할 수 있습니다(UTF-8 데이터가 있는 곳에 예상치 못한 내용이 포함되어 있음에도 불구하고).question.txt
Q
예는 다음과 같습니다.
Commision.txt
UTF-16BE로 인코딩된 ASCII(BOM 포함)입니다.
% xxd Commision.txt
0000000: feff 0046 0069 0072 0073 0074 0020 006c ...F.i.r.s.t. .l
0000010: 0069 006e 0065 000a 004c 0069 006e 0065 .i.n.e...L.i.n.e
0000020: 0020 0077 0069 0074 0068 0020 0061 0020 . .w.i.t.h. .a.
0000030: 0075 0063 0020 0027 0071 0027 003a 0020 .u.c. .'.q.'.:.
0000040: 0028 0051 0029 000a 004c 0061 0073 0074 .(.Q.)...L.a.s.t
0000050: 0020 006c 0069 006e 0065 000a . .l.i.n.e..
question.txt
ASCII(또는 UTF-8로 인코딩된 ASCII)입니다.
% xxd question.txt
0000000: 5768 6174 2069 7320 7468 6520 6169 722d What is the air-
0000010: 7370 6565 6420 7665 6c6f 6369 7479 206f speed velocity o
0000020: 6620 616e 2075 6e6c 6164 656e 2073 7761 f an unladen swa
0000030: 6c6c 6f77 3f0a llow?.
나는 그것들을 결합한다sed.
% sed '/Q/{
s/Q//g
r question.txt
}' Commision.txt >newFile
newFile
엉망이에요.
sed2바이트 UTF-16 표현( ) 대신 Q
단일 바이트( )를 제거했습니다 . 이는 파일의 나머지 부분에 대한 2바이트 정렬을 중단하고 전체 길이 대신 홀수를 제공하고 UTF-16 NULL( )을 도입합니다.51
00 51
0000
% xxd newFile
0000000: feff 0046 0069 0072 0073 0074 0020 006c ...F.i.r.s.t. .l
0000010: 0069 006e 0065 000a 004c 0069 006e 0065 .i.n.e...L.i.n.e
0000020: 0020 0077 0069 0074 0068 0020 0061 0020 . .w.i.t.h. .a.
0000030: 0075 0063 0020 0027 0071 0027 003a 0020 .u.c. .'.q.'.:.
0000040: 0028 0000 2900 0a57 6861 7420 6973 2074 .(..)..What is t
0000050: 6865 2061 6972 2d73 7065 6564 2076 656c he air-speed vel
0000060: 6f63 6974 7920 6f66 2061 6e20 756e 6c61 ocity of an unla
0000070: 6465 6e20 7377 616c 6c6f 773f 0a00 4c00 den swallow?..L.
0000080: 6100 7300 7400 2000 6c00 6900 6e00 6500 a.s.t. .l.i.n.e.
0000090: 0a .
엉망이더라도 내 UTF-8 터미널에서는 괜찮아 보입니다.
% cat newFile
First line
Line with a uc 'q': ()
What is the air-speed velocity of an unladen swallow?
Last line
그러나 Vim에 로드하면 뭔가 분명히 잘못되었습니다(실제로 여는 괄호 뒤에 NUL이 있지만 그 존재로 인해 이 게시물이 잘립니다). Vim은 "라인 2의 변환 오류"라고 경고합니다.
First line
Line with a uc 'q': (⤀桡琠楳⁴桥楲灥敤⁶敬潣楴礠潦渠畮污摥渠獷慬汯眿䰀愀猀琀 氀椀渀攀
물음표를 제거하고 question.txt
(다시 짝수 바이트 제공) 재생성하면 newFile
마지막 줄을 "뒤로" 가져오고(두 번째 줄 끝에 붙어 있지만) Vim의 변환 경고를 피합니다.
First line
Line with a uc 'q': (⤀桡琠楳⁴桥楲灥敤⁶敬潣楴礠潦渠畮污摥渠獷慬汯眊Last line