Linux 터미널에 BMPString 내용 표시

4089 단어 linuxC 언어
이전 블로그에서는 Windows 콘솔 인터페이스에서 BMPString을 출력하는 방법을 소개했지만, 그곳의 방법은 리눅스에서는 적용되지 않는다.만약 그곳의 예시 코드를 리눅스 아래에 놓고 실행한다면, 출력의 결과는 엉망이 될 것이다.코드가 깨진 원인은 wchart 유형의 변수는 Windows와 Linux의 바이트 길이가 다릅니다.
다음 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 컴파일러로 컴파일한 후 다음 그림과 같이 출력됩니다.

좋은 웹페이지 즐겨찾기