안녕하세요, 저는 이것에 대해 정신을 잃고 있습니다. 터미널에서 직접 입력으로 일부 문자열을 가져온 다음 문자열에 입력된 각 바이트의 ascii 값을 인쇄하는 c로 작성된 프로그램이 있습니다. 입력 확장자 ascii를 시험해 보고 있습니다. 값(127보다 큰 값)을 사용했지만 그렇게 하지 않았습니다. 특히 ASCII 값을 입력해야 합니다.137문자열로 입력 -> 해당 값을 가진 문자를 입력하여 거의 모든 것을 시도했습니다.
- 키를 작성하고 다음을 입력하세요.
e
+"
- 유니코드 값
ctrl
++ 뒤에 ASCII 코드의 16진수 값이 옵니다. 이는 유니코드로 입력되므로 값shift
137u
에 대해 1바이트 대신 2바이트가 필요합니다. ctrl
+d
- 확장 ASCII 값은 지원되지 않습니다.
어쨌든 이 문제를 해결하는 방법을 아는 사람이 있다면 도움이 될 것입니다.
답변1
당신이 사용할 수있는luit
, 이를 통해 cp850 애플리케이션을 실행할 수 있습니다(로케일UTF-8 터미널에서 이를 찾아 luit
UTF-8로 변환하거나 UTF-8에서 변환할 수 있습니다.
그만한 가치가 있는 만큼,스크린샷Luit가 포함된 cp850:
스크린샷은 각 로케일 인코딩에 대한 테스트 화면을 표시하는 스크립트 세트로 설정됩니다. 모든 인코딩이 해당 로케일 정보로 구성되는 것은 아닙니다. 761로케일내 Debian 7 시스템에는 locale -a
32개의 인코딩만 나열되어 있습니다.
ANSI_X3.4-1968 EUC-TW ISO-8859-14 ISO-8859-9
ARMSCII-8 GB18030 ISO-8859-15 KOI8-R
BIG5 GB2312 ISO-8859-2 KOI8-T
BIG5-HKSCS GBK ISO-8859-3 KOI8-U
CP1251 GEORGIAN-PS ISO-8859-5 RK1048
CP1255 ISO-8859-1 ISO-8859-6 TCVN5712-1
EUC-JP ISO-8859-10 ISO-8859-7 TIS-620
EUC-KR ISO-8859-13 ISO-8859-8 UTF-8
최신 버전의 luit(예: 2013년 2.0)가 있고 로케일 정보가 설치되어 있는 경우 실행하는 것은 간단합니다.
luit -encoding cp850
응용 프로그램이 코드 페이지 850을 사용하는 셸을 실행하지만 선택/붙여넣기(및 키보드)는 셸에서 로케일 인코딩으로 변환됩니다(POSIX에서만 작동하지 않으므로 UTF-8로 가정함) 언어 환경 .
이것-v
(verbose) 옵션은 몇 가지 세부 정보를 표시합니다.
$ luit -encoding cp850 -v -v
getCharsetByName(ASCII)
cachedCharset 'ASCII'
getCharsetByName(<null>)
using unknown 94-charset
getCharsetByName(CP 850)
cachedCharset 'CP 850'
getCharsetByName(<null>)
using unknown 94-charset
Input: G0 is ASCII, G1 is Unknown (94), G2 is CP 850, G3 is Unknown (94).
GL is G0, GR is G2.
Output: G0 is ASCII, G1 is Unknown (94), G2 is CP 850, G3 is Unknown (94).
GL is G0, GR is G2.
이전 luit를 사용하면 불완전한 로케일 정보에 의존하기 때문에 제대로 작동하지 않습니다. Luit 1.1.1의 기능은 다음과 같습니다:
$ luit -encoding cp850 -v -v
Warning: couldn't find charset data for locale cp850; using ISO 8859-1.
G0 is ASCII, G1 is Unknown (94), G2 is ISO 8859-1, G3 is Unknown (94).
GL is G0, GR is G2.
OpenSuSE를 실행하는 경우 패키지가 제공됩니다. 다른 극단(예: Ubuntu)에서는 로케일을 구성하는 것이 번거롭지만 luit
소스에서 컴파일하는 것은 비교적 간단합니다.
답변2
바이트는 문자가 아니며 문자는 바이트가 아닙니다. 문자와 바이트 간의 대응은 로케일에 따라 다릅니다. UTF-8 로케일에서 문자는 2바이트 (10진수 194 및 137) ‰
로 표시됩니다 . 이 값(10진수 137)이 있는 원시 바이트 는 유효하지 않습니다. 키보드에 나타나지 않는 문자를 입력하는 방법은 단말기 및 데스크탑 환경에 따라 다릅니다.\xC2\x89
\x89
원하는 것이 프로그램에 임의의 바이트를 보내는 것이라면 파이프를 사용할 수 있습니다. 예를 들면 다음과 같습니다.
$ echo -ne '\x89' | hexdump -C
00000000 89 |.|
00000001
답변3
ASCII 코드7비트 문자 인코딩입니다. 0-127 범위의 정수 값을 문자 집합에 매핑합니다(모두 인쇄할 수 있는 것은 아닙니다). 범위에는 137이 포함되지 않습니다. "ascii 값 137"과 같은 것은 없습니다.
값이 137인 바이트를 입력하려는 경우 프로그램은 해당 값을 16진수로 인쇄합니다. 이는 ASCII와는 아무 관련이 없지만 터미널에서 사용되는 인코딩과 관련이 있습니다. 바이트 137을 입력하려면 해당 바이트로 인코딩된 문자를 입력해야 합니다. 최신 시스템 사용법UTF-8, 대부분의 문자는 여러 바이트로 인코딩됩니다. 어떤 문자의 UTF-8 인코딩도 바이트 시퀀스 {137}이 아니며 어떤 문자의 인코딩도 이 바이트 값으로 시작하지 않습니다(모든 멀티바이트 인코딩은 192보다 큰 값으로 시작함). 그러나 일부 문자는 UTF-8에서 {195, 137}로 인코딩되는 É = U+00C9와 같이 두 번째 바이트가 137인 2바이트 시퀀스로 인코딩됩니다.
임의의 바이트 값을 입력하여 전송하려면 단일 바이트 인코딩을 사용해야 합니다. cp850과 같이 인쇄할 수 없는 문자(예: 128-159 범위는 latin-1 인코딩에서 인쇄할 수 없음)를 포함하지 않는 문자를 선택하세요. 바라보다토마스 디키의 답변이를 달성하기 위해 luit를 사용하는 방법을 알아보세요.
또는 프로그램이 이를 포함하는 파일에서 읽도록 하거나 이를 생성한 프로그램에서 파이핑하여 임의의 바이트 값을 입력할 수 있습니다. 예를 들어, bash에서는 다음과 같이 작성할 수 있습니다.
printf \\211 | ./myprogram # works in any shell
printf $'\x89' | ./myprogram
./myprogram <<<$'\x89'