繁体   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