为什么在将窄字符串转换为宽字符串时用 0xFF 屏蔽字符?

2024-03-25

考虑这个函数将窄字符串转换为宽字符串 /a/39018368:

std::wstring convert(const std::string& input)
{
    try
    {
        std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
        return converter.from_bytes(input);
    }
    catch(std::range_error& e)
    {
        std::size_t length = input.length();
        std::wstring result;
        result.reserve(length);
        for(std::size_t i = 0; i < length; i++)
        {
            result.push_back(input[i] & 0xFF);
        }
        return result;
    }
}

我很难理解后备路径中这个表达式的必要性:

result.push_back(input[i] & 0xFF);

为什么字符串中的每个字符都用 0xFF (0b11111111) 屏蔽?


掩蔽用0xFF将任何负值减少到 0-255 范围内。

这是合理的,例如,如果您的平台char是代表 ISO-8859-1 字符的 8 位有符号类型,并且您的wchar_t代表 UCS-2、UTF-16 或 UCS-4。


如果没有此更正(或类似的操作,例如转换为unsigned char or std::byte),您会发现当提升为更宽的类型时,字符会被符号扩展。

示例:0xa9(©在 Unicode 和 Latin-1 中,-87 在有符号 8 位中)将变为\uffa9代替\u00a9.


我认为转换更清楚char to an unsigned char- 适用于任何大小的字符,并更好地传达意图。您可以直接更改该表达式,或创建一个codecvt为您正在做的事情命名的子类。

以下是如何编写和使用最小的codecvt(仅适用于窄→宽转换):

#include <codecvt>
#include <locale>
#include <string>

class codecvt_latin1 : public std::codecvt<wchar_t,char,std::mbstate_t>
{
protected:
    virtual result do_in(std::mbstate_t&,
                         const char* from,
                         const char* from_end,
                         const char*& from_next,
                         wchar_t* to,
                         wchar_t* to_end,
                         wchar_t*& to_next) const override
    {
        while (from != from_end && to != to_end)
            *to++ = (unsigned char)*from++;
        from_next = from;
        to_next = to;
        return result::ok;
    }
};

std::wstring convert(const std::string& input)
{
    using codecvt_utf8 = std::codecvt_utf8<wchar_t>;
    try {
        return std::wstring_convert<codecvt_utf8>().from_bytes(input);
    } catch (std::range_error&) {
        return std::wstring_convert<codecvt_latin1>{}.from_bytes(input);
    }
}
#include <iostream>

int main()
{
    std::locale::global(std::locale{""});

    // UTF-8:  £© おはよう
    std::wcout << convert(u8"\xc2\xa3\xc2\xa9 おはよう") << std::endl;
    // Latin-1: 壩
    std::wcout << convert("\xc2\xa3\xa9") << std::endl;
}

Output:

£© おはよう
壩
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在将窄字符串转换为宽字符串时用 0xFF 屏蔽字符? 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • CancellationToken.ThrowIfCancellationRequested 之后出现故障与取消的任务状态

    通常我不会发布带有答案的问题 但这次我想引起一些注意 我认为这可能是一个晦涩但常见的问题 它是由这个问题 https stackoverflow com q 24346706 1768303 从那时起我回顾了自己的旧代码 发现其中一些也受到
  • UITextview打字属性不起作用

    我有 UITextView 我想将其行高设置为 50 0f 所以我使用打字属性 但没有任何效果 我的代码在 ViewDidAppear 方法中像这样 UITextView textView UITextView alloc initWith
  • java中RGB转灰度、bmp图像

    我的老师给我们布置了一个任务 要制作一个采用 640x480 bmp 彩色图像的课程 将其转换为灰度图像 我找到了一些有想法的资源 所以我做到了 但是有一个问题 因为它似乎使它不会给我错误 但输出没有出现 我认为这是我的代码 我的代码是 i
  • IntelliJ IDEA:ClassNotFoundException 如果运行调试,执行/运行确实有效

    我在 Eclipse 中启动了一个 Java Maven 项目 处理了几天 然后将其导入到 IntelliJ IDEA 中 再次处理了几天 IDEA 和 shell 中的正常运行 执行确实有效 但调试无效 当我单击调试的 Bug 图标时 它
  • Java 的反射器?

    Java 有没有相当于 NET反射器 http www red gate com products reflector 编辑 更具体地说 反编译是我所追求的 See 如何反编译Java类文件 https stackoverflow com
  • 有人将 Node.js 与 Amazon SNS 和 Apple 推送通知一起使用吗?

    我正在寻找将 node js 与 Amazon SNS 和 Apple APN 推送通知结合使用的示例 我们使用 Amazon 进行托管 我以前也使用过 SNS 这非常简单 但他们提供的推送通知示例是针对 java 的 没有针对 Node
  • Cython:(为什么/何时)使用 Py_ssize_t 进行索引是否更好?

    这是后续这个问题 https stackoverflow com questions 20978938 cython should i use np float t rather than double for typed memory v
  • 更改 UpdatePanel 外部 TextBox 中的文本

    我在 UpdatePanel 中有一个 gridview gridview 显示在弹出窗口中 单击该网格中的选择按钮后 我尝试在页面中设置文本框文本 但它不起作用 如果我删除更新面板那么它就会工作 这是我在 aspx 中的代码 div di
  • Spring security:注销后重定向到上一个网址

    我有一个使用 spring security 的网络应用程序 我想在用户注销时将用户重定向回他们注销之前所在的同一页面 是否有捷径可寻 不确定这个问题指的是哪个 Spring 版本 但有一个useReferer标准属性org springf
  • XmlWriter 编码问题

    我有以下代码 MemoryStream ms new MemoryStream XmlWriter w XmlWriter Create ms w WriteStartDocument true w WriteStartElement da
  • 如何捕获 Room 持久性库中未处理的异常

    背景 我在 Android Java 项目中使用 Room 持久性库来支持本地数据缓存 查询或保存数据时 Room 在专用线程上运行 Problem 如果 Room 管理的这些线程之一引发异常 则整个应用程序将崩溃 如果数据不一致 例如数据
  • 在 text2vec R 包中准备词嵌入

    基于text2vec包的小插图 提供了一个创建词嵌入的示例 对wiki数据进行标记 然后创建术语共现矩阵 TCM 该矩阵用于使用包中提供的glove函数创建词嵌入 我想为包中提供的电影评论数据构建词嵌入 我的问题是 我是否需要将所有电影评论
  • 递归 JSONB postgres

    我正在尝试在 Postgres 中构建一个支持数组和对象的递归 CTE 以返回键值对列表 但似乎无法找到一个好的示例 这是我当前的代码 with recursive jsonRecurse as select j key as Path j
  • 从组合框填充文本框

    我在 Microsoft Access 中创建了一个表单 并添加了一个从数据库表填充的组合框 我还有一个文本框 当组合框更改时 我想从查询中填充该文本框 我的查询如下 SELECT C Nome FROM Categories AS C I
  • 在容器视图中均匀分布多个视图

    自动布局让我的生活变得困难 理论上 当我切换时它会非常有用 但我似乎一直在与之抗争 我制作了一个演示项目来尝试寻求帮助 有谁知道如何在调整视图大小时使视图之间的空间均匀增加或减少 以下是三个标签 手动垂直均匀间隔 我想要的是让他们在旋转时均
  • 在字符串数组中,如何对部分字符串的数组进行排序

    当我开始为此编写冒泡排序时 我想也许有一种方法可以使用带有 array sort 的函数来完成这项工作 这是我必须排序的 希望 清晰的示例 文件名列表 var array impression page 1 12 juin impressi
  • 此应用程序正在从后台线程修改自动布局引擎,这可能会导致引擎损坏和奇怪的崩溃

    当我在模拟器中运行应用程序时 我在控制台中收到此日志 在 iOS 8 中没有看到过这个 我不太确定是什么原因造成的 有其他人遇到过同样的问题吗 如果有 是如何解决的 或者有人可以在这方面提供任何帮助吗 除了主线程之外 不要更改 UI 虽然它
  • 通过 http 标头添加网站图标

    假设我想在动态生成的页面 特别是 ADF Faces 页面 但这无关紧要 上添加网站图标 我无法修改生成的 html 的标签 所以我尝试在servlet header中添加一个http header 我希望我的标题与 html head 元
  • 如何更改 Android 中的 Parse 推送通知图标?

    在我的应用程序中 我使用解析云代码向用户发送推送通知 默认情况下 通知图标使用应用程序图标 但我想更改通知图标 我在清单 xml 中使用了下面的代码
  • 为什么在将窄字符串转换为宽字符串时用 0xFF 屏蔽字符?

    考虑这个函数将窄字符串转换为宽字符串 a 39018368 std wstring convert const std string input try std wstring convert