C++11 字符转换 UTF-8 UTF-16 UTF-32 UNICODE 错误LINK2001
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++11 字符转换 UTF-8 UTF-16 UTF-32 UNICODE 错误LINK2001相关的知识,希望对你有一定的参考价值。
auto wstr = u"123f中文";
std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> cvt;
auto hr = cvt.to_bytes(wstr);
严重性 代码 说明 项目 文件 行
错误 LNK2001 无法解析的外部符号 "__declspec(dllimport) public: static class std::locale::id std::codecvt<char16_t,char,struct _Mbstatet>::id" (__imp_?id@?$codecvt@_SDU_Mbstatet@@@std@@2V0locale@2@A) CA c:\Users\a1827_000\documents\visual studio 2015\Projects\CA\CA\CA.obj 1
unicode.org制定的编码机制, 要将全世界常用文字都函括进去.
在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应一个字符; 在2.0开始抛弃了16位限制, 原来的16位作为基本位平面, 另外增加了16个位平面, 相当于20位编码, 编码范围0到0x10FFFF.
UTF: Unicode/UCS Transformation Format
UTF-8, 8bit编码, ASCII不作变换, 其他字符做变长编码, 每个字符1-3 byte. 通常作为外码. 有以下优点:
* 与CPU字节顺序无关, 可以在不同平台之间交流
* 容错能力高, 任何一个字节损坏后, 最多只会导致一个编码码位损失, 不会链锁错误(如GB码错一个字节就会整行乱码)
UTF-16, 16bit编码, 是变长码, 大致相当于20位编码, 值在0到0x10FFFF之间, 基本上就是unicode编码的实现. 它是变长码, 与CPU字序有关, 但因为最省空间, 常作为网络传输的外码.
UTF-16是unicode的preferred encoding.
UTF-32, 仅使用了unicode范围(0到0x10FFFF)的32位编码, 相当于UCS-4的子集.
UTF与unicode的关系:
Unicode是一个字符集, 可以看作为内码.
而UTF是一种编码方式, 它的出现是因为unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码, 没有变换, 但它包含了0x00在编码内, 头256字节码的第一个byte都是0x00, 在操作系统(C语言)中有特殊意义, 会引起问题. 采用UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来一些优点.追问
答非所问 我是问为什么会出现LINK2001的错误 如何将其排除
参考技术A 这是vs的一个bug。可以用下面的替代第一种方法:
std::wstring_convert<std::codecvt_utf8_utf16<int16_t>, int16_t> conversion;
std::string mbs = conversion.to_bytes((const int16_t*)u"\u4f60\u597d"); // ni hao (你好)
第二种方法:
std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
vs2017下亲测可用! 参考技术B #include <iostream>
#include <string>
#include <codecvt>
using namespace std;
int main(int argc, char *argv[])
std::wstring str = L"123,我是谁?";
std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
std::string narrowStr = conv.to_bytes(str);
cout<<narrowStr<<endl;
std::wstring wideStr = conv.from_bytes(narrowStr);
wcout<<wideStr<<endl;
return 0;
追问
要的是utf8 和utf16 utf32互转
以上是关于C++11 字符转换 UTF-8 UTF-16 UTF-32 UNICODE 错误LINK2001的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 和 Linux 下,在 C 中将 UTF-16 转换为 UTF-8