当前位置:  开发笔记 > 编程语言 > 正文

如何将Unicode字符串转换为utf-8或utf-16字符串?

如何解决《如何将Unicode字符串转换为utf-8或utf-16字符串?》经验,为你挑选了2个好方法。

如何将Unicode字符串转换为utf-8或utf-16字符串?我的VS2005项目使用Unicode字符集,而cppite中的sqlite提供

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
int sqlite3_open16(
  const void *filename,   /* Database filename (UTF-16) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

用于打开文件夹.如何将字符串,CString或wstring转换为UTF-8或UTF-16字符集?

非常感谢!



1> 1800 INFORMA..:

使用WideCharToMultiByte函数.指定CP_UTF8CodePage参数.

CHAR buf[256]; // or whatever
WideCharToMultiByte(
  CP_UTF8, 
  0, 
  StringToConvert, // the string you have
  -1, // length of the string - set -1 to indicate it is null terminated
  buf, // output
  __countof(buf), // size of the buffer in bytes - if you leave it zero the return value is the length required for the output buffer
  NULL,    
  NULL
);

此外,Windows中unicode应用程序的默认编码是UTF-16LE,因此您可能不需要执行任何转换,只需使用第二个版本sqlite3_open16.



2> Serge Wautie..:

简短回答:

如果使用CString或wstring等Unicode字符串,则无需转换.使用sqlite3_open16().你必须确保传递一个WCHAR指针(已经转换为void *.看起来很蹩脚!即使这个lib是跨平台的,我猜他们可能已经定义了一个宽的char类型,它取决于平台并且不比a更不友好void *). API.比如CString:(void*)(LPCWSTR)strFilename

答案越长:

您没有要转换为UTF8或UTF16的Unicode字符串.您在程序中使用给定的编码表示Unicode字符串:Unicode本身不是二进制表示形式.编码说明Unicode代码点(数值)如何在内存中表示(数字的二进制布局).UTF8和UTF16是使用最广泛的编码.但它们非常不同.

当一个VS项目说"Unicode charset"时,它实际上意味着"字符被编码为UTF16".因此,您可以直接使用sqlite3_open16().无需转换.字符存储在WCHAR类型(相对于char)中,占用16位(标准C类型的回退wchar_t,在Win32上占16位.在其他平台上可能会有所不同.感谢校正,Checkers).

还有一个您可能需要注意的细节:UTF16有两种版本:Big Endian和Little Endian.这是这16位的字节顺序.您为UTF16提供的函数原型并未说明使用了哪种排序.但是你很安全,假设sqlite使用与Windows相同的字节序(Little Endian IIRC.我知道顺序,但一直有名字的问题:-)).

编辑:回答Checkers的评论:

UTF16使用16位代码单元.在Win32下(在Win32上),wchar_t用于此类存储单元.诀窍是一些Unicode字符需要2个这样的16位代码单元的序列.他们被称为代理对.

UTF8使用1到4个字节序列表示1个字符的方式相同.然而,UTF8与该char类型一起使用.


不不不!sqlite3_open16()使用'void*'参数,因为它声明为UTF16,*NOT*wchar_t,它在不同平台上具有不同的大小,可能是也可能不是UTF16(即glibc有4字节的wchar_t).
推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有