簡體   English   中英

wchar_t到八位字節-在C中?

[英]wchar_t to octets - in C?

我正在嘗試將wchar_t字符串存儲為八位字節,但是我很肯定自己做錯了-有人介意驗證我的嘗試嗎? 一個字符占用4個字節會發生什么情況?

  unsigned int i;
  const wchar_t *wchar1 = L"abc";
  wprintf(L"%ls\r\n", wchar1);

  for (i=0;i< wcslen(wchar1);i++) {
    printf("(%d)", (wchar1[i]) & 255);
    printf("(%d)", (wchar1[i] >> 8) & 255);
  }

Unicode文本始終是編碼的。 流行的編碼是UTF-8,UTF-16和UTF-32。 只有后者具有固定的字形大小。 UTF-16在上層平面中使用代用品作為代碼點,這樣的字形使用2 wchar_t。 UTF-8是面向字節的,它使用1到4個字節對一個編碼點進行編碼。

如果您需要將文本轉碼為面向字節的流,則UTF-8是一個絕佳的選擇。 Internet上文本文件和HTML編碼的非常常見的選擇。 如果使用Windows,則可以將WideCharToMultiByte()與CodePage = CP_UTF8一起使用。 ICU庫是一個很好的選擇。

請注意避免將文本轉換為代碼頁的字節編碼,例如wcstombs()。 它們是有損編碼,在代碼頁中沒有相應字符代碼的字形由?代替。

您可以使用stdlib.h提供的wcstombs() (寬字符字符串到多字節字符串)功能

原型如下:

#include <stdlib.h>

size_t wcstombs(char *dest, const wchar_t *src, size_t n);

它將src提供的wchar_t字符串正確轉換為char (又名八位字節)字符串,並將其最多寫入n個字節的dest

char wide_string[] = "Hellöw, Wörld! :)";
char mb_string[512]; /* Might want to calculate a better, more realistic size! */
int i, length;

memset(mb_string, 0, 512);
length = wcstombs(mb_string, wide_string, 511);

/* mb_string will be zero terminated if it wasn't cancelled by reaching the limit
 * before being finished with converting. If the limit WAS reached, the string
 * will not be zero terminated and you must do it yourself - not happening here */

for (i = 0; i < length; i++)
   printf("Octet #%d: '%02x'\n", i, mb_string[i]);

如果試圖查看包含字符串的內存緩沖區的內容,則可以執行以下操作:

  size_t len = wcslen(str) * sizeof(wchar_t);
  const char *ptr = (const char*)(str);
  for (i=0; i<len; i++) {
    printf("(%u)", ptr[i]);
  }

我不知道為什么printf和wprintf不能一起工作。 以下代碼有效。

unsigned int i;
const wchar_t *wchar1 = L"abc";
wprintf(L"%ls\r\n", wchar1);

for(i=0; i<wcslen(wchar1); i++)
{   
    wprintf(L"(%d)", (wchar1[i]) & 255);
    wprintf(L"(%d)", (wchar1[i] >> 8) & 255);
}   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM