雪千渔Blog

  • 首页
  • Coding
    • dotNet
    • C++
    • Lua
    • Visual Basic
    • Java
    • Android
    • Web
  • DCC
    • Maya
    • Maya-Plug
    • AfterEffect
    • AfterEffect-Plug
    • PhotoShop-Plug
  • GameDev
    • Unity3D
    • UnrealEngine
    • 经验杂谈
    • 游戏设计
    • 自研引擎
    • 效果实现
  • Graphics
    • OpenGL
    • Vulkan
    • 计算机图形学
  • 其他
    • 乱七八糟
    • 软件工具
    • 留言板
    • 自制素材
    • 关于我
雪千渔blog
唯有热爱,能抵漫长岁月
  1. 首页
  2. Coding
  3. C++
  4. 正文

C++字符串编码与编译器实现

2021年5月14日 1002点热度 4人点赞 0条评论

在本篇文章中,Unicode指的是字符集而非UTF-16。

在Windows系统中,UTF8编码会被当作为普通的ASCII编码文件,ASCII是无法储存多字节字符的,所以使用UTF-8并且代码中存在多字节字符时会提示“该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失”,遇到这种情况就是无法正确识别UTF-8文件,所以必须添加一个BOM头,即UTF-8 BOM编码格式,才可以正确识别为UTF-8编码。

在MSVC编译器中,可以使用UTF-8 BOM、其他Unicode编码(UTF-16/UTF-32等)以及ANSI(中文GBK2312)等多字节编码的文件格式,文件使用什么编码,字符串就使用什么编码。

但是在VS2019(16.9)中测试不管是什么编码格式的文件,都不影响对字符串的编码。

以下文件编码分别为UTF-8 BOM与ANSI(GBK2312)

#include <iostream>

void printANSI();

int main()
{
    printANSI();
    const char* str = "啊_2";
    const wchar_t* wstr = L"啊w_2";
    const char* u8str = u8"啊u8_2";
    const char16_t* u16str = u"啊u16_2";

    std::cout << (int)str[0] << "    " << (int)wstr[0] << "    "
        << (int)u8str[0] << "    " << (int)u16str[0] << std::endl;
}

#include <iostream>

void printANSI()
{
    const char* str = "啊_1";
    const wchar_t* wstr = L"啊w_1";
    const char* u8str = u8"啊u8_1";
    const char16_t* u16str = u"啊u16_1";

    std::cout << (int)str[0] << "    " << (int)wstr[0] << "    "
        << (int)u8str[0] << "    " << (int)u16str[0] << std::endl;
}

结果:
-80    21834    -27    21834
-80    21834    -27    21834

这两个文件输出的结果是一致的,文件编码不会影响对字符串的编码,MSVC编译结果总结如下:

  • 普通的字符串使用ANSI编码
  • 宽字符使用UTF-16编码
  • 可以显式使用u8将字符串声明为UTF-8编码。

 

g++(MinGW)测试结果:

-27    21834    -27    21834
-23    37727    -23    37727

g++如果源文件的编码不同是不会成功编译的,如果不是UTF8编码则需要指定参数:-finput-charset=GBK和-fexec-charset=GBK。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: C# 编码
最后更新:2021年5月25日

JomiXedYu

独游开发者 & 技术美术

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

JomiXedYu

独游开发者 & 技术美术

最新 热点 随机
最新 热点 随机
HLSL对Vulkan的适应性以及伪语义绑定 GPU呈现模式与垂直空白 自研引擎PulsarEngine的Shader编译流程 UE材质Custom节点与HLSL的HACK操作 UE5出现D3D12崩溃报错解决方案 游戏引擎脚本绑定的三种写法与利弊
HLSL对Vulkan的适应性以及伪语义绑定
一种解决不支持中文与空格文件名的编码 委托DynamicInvoke与反射Invoke性能测试 AE多开多线程渲染工具单机版MultiAERender发布 在EditorWindow上显示自定义类型列表 Unity之Galgame引擎框架制作思路 ArrayList与List的解析
友情链接
  • DorinXL
  • 小博博客
  • 秋橘斋

COPYRIGHT © 2014-2023 雪千渔Blog. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

辽ICP备20006894号-1