문자열을 UTF-8에서 UTF-7-IMAP으로 변환하려면 파이프를 만들어야 합니다.

문자열을 UTF-8에서 UTF-7-IMAP으로 변환하려면 파이프를 만들어야 합니다.

IMAP 메일 디렉토리의 명령줄에서 수백 개의 디렉토리를 자동으로 생성하려면 즉시 UTF-8 문자열을 UTF-7-IMAP으로 변환할 수 있어야 합니다.

PHP에서는 문자열을 매개변수로 전달하여 이 작업을 수행하는 방법을 찾았지만 그다지 실용적이지 않으며 PHP를 설치해야 합니다.

<?php
echo mb_convert_encoding($argv[1], "UTF7-IMAP", "UTF8");
?>

Iconv는 UTF-7-IMAP에 대해 모르는 것 같습니다.

반대 작업을 수행할 수 있는 구문을 찾았습니다.

echo "Sant&AOk-" | tr "&" "+" | iconv -f UTF-7 -t UTF-8
Santé

하지만 이는 되돌릴 수 없습니다(마지막 "-"가 누락됨).

echo "Santé" | iconv -f UTF-8 -t UTF-7 | tr '+' '&'
Sant&AOk

인터넷에서 이에 대한 정보를 거의 찾을 수 없습니다.

편집하다:

나는 이것이 잘 작동한다는 것을 알았습니다.

perl -CSA -MEncode::IMAPUTF7 -le 'print Encode::IMAPUTF7::encode("IMAP-UTF-7", shift)' "Santé"

하지만 파이프라인을 만드는 방법은 무엇입니까?

echo "Santé" | perl ...

답변1

iconv(또는 Debian 12에서 사용 가능한 최소 2.36 버전) 어떤 인코딩이 필요한지 알아보세요.

$ iconv -l | grep -i imap
UTF-7-IMAP//

그래서:

$ printf '%s\n' 'Santé' | iconv -f UTF-8 -t UTF-7-IMAP; echo ''
Sant&AOkACg-
$ printf '%s' 'Santé' | iconv -f UTF-8 -t UTF-7-IMAP; echo ''
Sant&AOk-

두 출력 모두 개행 문자가 누락되어 있으므로 echo는 가독성을 높이기 위해 결과 끝에 이를 추가하지만 개행 문자는예전에는인코딩하므로 문자열 끝에 LF를 추가하거나 추가하지 않으면 두 가지 다른 결과가 생성됩니다.

답변2

하지만사용iconv(또는 recode문자 세트 변환 전용 기타 도구) IMAP-UTF-7을 지원한다고 가정하면 명령이 인수 대신 입력을 처리 uconv하도록 하려면 다음을 수행할 수 있습니다 .perl

$ echo Santé | perl -CIi  -MEncode::IMAPUTF7 -pe '$_ = Encode::IMAPUTF7::encode("IMAP-UTF-7", $_)'
Sant&AOkACg-

-p입력(또는 인수로 제공된 파일)을 읽고 이와 같이 각 줄에서 코드가 실행되는 sed패턴 에 사용됩니다 . 와 달리 줄 구분 기호를 포함한다는 점을 제외하면 와 동일한 패턴 공간 입니다.perlsed$_sedperlsed

를 사용하면 stdin 및 기타 입력(예: 인수에 있는 파일의 입력)에 UTF-8로 인코딩된 텍스트를 예상하도록 -CIi지시하므로 perl입력 시 자동으로 디코딩됩니다.


또는 Linux 기반 시스템과 같은 명령 출력 등 perl -pe '$_ = uc $_' 'uname|'. 뒤에서 설명하는 다이아몬드 연산자를 LINUX사용합니다 .<>perldoc perlop

관련 정보