热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

charvswchar_t何时使用哪种数据类型

如何解决《charvswchar_t何时使用哪种数据类型》经验,为你挑选了3个好方法。

我想了解的区别charwchar_t?我理解wchar_t使用更多的字节但是我可以得到一个明确的例子来区分我何时使用charvswchar_t



1> Thomas Matth..:

从根本上说,wchar_t当编码具有比char可以包含的符号更多的符号时使用.

背景
char类型具有足够的容量来保持在ASCII字符集的任何字符(编码).

问题是许多语言需要比ASCII帐户更多的编码.因此,代替127种可能的编码,需要更多.有些语言有超过256种可能的编码.甲char类型并不保证的范围大于256因此,一个新的数据类型是必需的大.

wchar_t,又名宽字符,提供了编码更大的空间.

摘要当编码范围为256或更小时
使用char数据类型,例如ASCII.wchar_t当您需要超过256的容量时使用.

首选Unicode来处理大字符集(例如emojis).


使用以下语句找出:`std :: cout <使用Unicode的首选方法是使用[`char16_t`和`char32_t`](http://en.cppreference.com/w/cpp/language/types#Character_types),因为它们具有已知的大小和范围.

2> o11c..:

切勿使用wchar_t.

如果可能,使用(某种数组)char,例如std::string,并确保它以UTF-8编码.

如果必须与不使用UTF-8的API进行交互,请使用char16_tchar32_t.否则不要使用它们; 它们只提供虚幻的优势并鼓励错误的代码.

请注意,在很多情况下,需要多个char32_t表示单个用户可见字符的情况.OTOH,使用UTF-8 char强迫您尽早处理可变宽度.


某些Windows API需要`wchar_t`,但是在Windows上您知道`wchar_t`是16位并且具有一定的稳定性。而且char32_t可以表示所有Unicode字符,这可能只是用户认为的字符的一个子集,但有时却很有用。我同意`char16_t`可能仅在与需要UTF-16的系统接口时才有用。

3> StaceyGirl..:

简短的anwser:

wchar_t除非与特定于操作系统的API交互(基本上wchar_t只用于调用Windows API函数),否则永远不要在现代C++中使用.

答案很长:

标准C++库的设计意味着只有一种方法可以处理Unicode - 通过在char数组中存储UTF-8编码的字符串,因为几乎所有函数都只存在于char变体中(想想std::exception::what).

在C++程序中,您有两种语言环境: - 标准C库语言环境设置std::setlocale - 标准C++库语言环境设置std::locale::global

不幸的是,他们没有定义的打开文件(如标准功能的行为std::fopen,std::fstream::open等等).操作系统之间的行为不同: - Linux编码不可知,因此这些函数只是将char字符串传递给底层系统调用 - 在Windows系统调用之前,使用用户特定的语言环境将Windows字符串转换为宽字符串

一切都通常在Linux上正常工作,因为每个人都使用基于UTF-8的语言环境,因此传递给main函数的所有用户输入和参数都将采用UTF-8编码.但是您可能仍需要显式地将当前语言环境切换为UTF-8变体,因为默认情况下C++程序使用默认"C"语言环境启动.此时,如果您只关心Linux并且不需要支持Windows,则可以使用char数组并std::string假设它是UTF-8序列并且所有内容都"正常".

当您想要支持Windows时出现问题,因为在这里您总是有另外的第三个区域设置:为当前用户设置的一个区域,可以在"控制面板"中的某处配置.主要问题是这个语言环境永远不是unicode语言环境,因此不可能使用类似函数std::fopen(const char *)std::fstream::open(const char *)使用Unicode路径打开文件.在Windows上,你将不得不使用使用非标准的Windows的特定功能,如自定义的包装_wfopen,std::fstream::open(const wchar_t *)在Windows上.您可以查看Boost.Nowide(尚未包含在Boost中)以了解如何执行此操作:http://cppcms.com/files/nowide/html/

使用C++ 17,您可以使用std::filesystem::path以便携方式存储文件路径,但它仍然在Windows上被破坏:

隐式构造函数std::filesystem::path::path(const char *)在MSVC上使用特定于用户的区域设置,并且无法使其使用UTF-8.函数std::filesystem::u8string应该用于从UTF-8字符串构造路径,但是很容易忘记这一点而是使用隐式构造.

std::error_category::message(int) 对于两个错误类别,使用特定于用户的编码返回错误描述.

所以我们在Windows上拥有的是:

打开文件的标准库函数已损坏,永远不应使用.

传递给的参数main(int, char**)被破坏,永远不应该使用.

以*A和宏结尾的WinAPI函数被破坏,永远不应该使用.

std::filesystem::path 部分损坏,不应直接使用.

错误类型的返回std::generic_categorystd::system_category破裂,绝不应该被使用.

如果你需要一个非平凡的项目的长期解决方案,我会建议:

使用Boost.Nowide或直接实现类似的功能 - 这个固定的破坏标准库.

重新实现返回的标准错误类别std::generic_category,std::system_category以便它们始终返回UTF-8编码的字符串.

包装,std::filesystem::path以便在将路径转换为字符串并将字符串转换为路径时,新类始终使用UTF-8.

包装所有必需的函数,std::filesystem以便它们使用您的路径包装器和您的错误类别.

不幸的是,这不会解决其他使用文件的库的问题,但是其中99%都会被破坏(不支持unicode).

这就是C++程序员的生活.Microsoft可以通过允许我们将Windows运行时切换到基于UTF-8的语言环境来解决这个问题,但由于向后兼容性,它们不会.

您可以查看此链接以获得进一步说明:http://utf8everywhere.org/


推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
呼和浩特-时尚范儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有