Linux 터미널에 BMPString 내용 표시
다음 C 프로그램은 Windows 및 Linux에서 모두 사용할 수 있습니다.
#include <stdio.h>
#include <wchar.h>
#if defined(_WIN32) || defined(_WIN64)
#include <stdlib.h>
#endif
int main(void)
{
printf("wide character (wchar_t type) length is %d bytes.
", sizeof(wchar_t));
#if defined(_WIN32) || defined(_WIN64)
system("pause");
#endif
return 0;
}
출력 결과는 다르다.64비트 Windows에서 마이크로소프트 컴파일러로 각각 32비트와 64비트 실행 프로그램으로 컴파일하여 출력 결과 wchart 형식 변수의 길이는 2바이트입니다.64비트 Linux에서 64비트 GCC로 컴파일한 후 실행하면 출력 결과 wchart 형식 변수의 길이는 4 바이트입니다.
Windows에서 BMPString을 처리할 때, 예를 들어 문자 '중' 에 대응하는 UTF-16 인코딩은 0x4E, 0x2D입니다. 우리가 처리하는 방법은big-endian 순서에서little-endian 순서로 바꾸고 wprintf () 함수로 출력하는 것입니다.
Linux에서 BMPString을 처리할 때, 예를 들어 문자'중'에 대응하는 UTF-16 인코딩은 0x4E, 0x2D이다. 우리가 처리하는 방법은 2바이트 길이에서 4바이트 길이로 확장하는 것이다. 확장할 때 새로 추가된 두 바이트의 값은 0x0, 0x0, 0x4E, 0x2D로 변경하고big-endian 순서에서little-endian 순서로 바꾸는 것이다. 즉, 인코딩을 0x2D, 0x4E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0으로 바꾸는 것이다.wprintf () 함수로 출력합니다.
그래서 Linux에서 BMPString을 표시하려면 일반적으로 UTF-16 big-endian 방식의 문자 인코딩을 UTF-32 big-endian 방식의 문자 인코딩으로 확장하고 확장 방법은 앞에 두 바이트의 0을 더한 다음에 UTF-32 big-endian 방식의 문자 인코딩을 UTF-32 little-endian 방식의 문자 인코딩으로 바꾸는 것이다.(UTF-16 big-endian 방식의 문자 인코딩을 little-endian 순서로 바꾸고 뒤에 두 바이트의 0을 더하면 효과가 같다.)
다음은 예제 프로그램입니다.
/**************************************************
* Author: HAN Wei
* Author's blog: http://blog.csdn.net/henter/
* Date: Oct 31th, 2014
* Description: demonstrate how to print BMPString
on Linux console
**************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>
/**************************************************
* :PrintBMPStringOnLinux
* : Linux BMPString
* :
BMPString [in]
BMPString_len [in] BMPString ,
* :
0
-1
**************************************************/
int PrintBMPStringOnLinux(unsigned char *BMPString, unsigned int BMPString_len)
{
unsigned char *buffer;
unsigned int buffer_len, i;
unsigned char *p, *q;
buffer_len = BMPString_len * 2 + 4; /* BMPString
,
\0( wchar_t ),
0x0, 0x0, 0x0, 0x0 */
if ( !(buffer = (unsigned char *)malloc(buffer_len)) )
{
#ifdef _DEBUG
printf("malloc() function failed!
");
#endif
return (-1);
}
memset(buffer, 0, buffer_len);
p = buffer;
q = BMPString;
for (i=0; i < (int)BMPString_len/2; i++)
{
*p = *(q+1);
*(p+1) = *q;
p += 4;
q += 2;
}
setlocale(LC_ALL, "zh_CN.utf8");
wprintf(L"BMPString: %ls
", (wchar_t *)buffer);
free(buffer);
return 0;
}
int main(void)
{
int error_code;
unsigned char BMPString_data1[]={0x4e, 0x2d, 0x56, 0xfd}; /* " " Unicode */
unsigned char BMPString_data2[]={0x0, 0x55, 0x0, 0x73, 0x0, 0x65, 0x0, 0x72}; /* "User" Unicode */
char str[]={0x2d, 0x4e, 0x0, 0x0, 0xfd, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
if ( error_code = PrintBMPStringOnLinux(BMPString_data1, sizeof(BMPString_data1)) )
{
printf("Print BMPstring on Windows console failed!
");
return (-1);
}
if ( error_code = PrintBMPStringOnLinux(BMPString_data2, sizeof(BMPString_data2)) )
{
printf("Print BMPstring on Windows console failed!
");
return (-1);
}
/* unicode Linux ,
: wchar_t UTF-16 ,
4 , little-endian */
printf("
");
setlocale(LC_ALL, "zh_CN.utf8");
wprintf(L"%ls
", (wchar_t *)str);
return 0;
}
이 프로그램은 64비트 CentOS에서 64비트 GCC 컴파일러로 컴파일한 후 다음 그림과 같이 출력됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.