我们可以简化这个字符串编码代码吗

2024-03-12

是否可以将此代码简化为更干净/更快的形式?

StringBuilder builder = new StringBuilder();
var encoding = Encoding.GetEncoding(936);

// convert the text into a byte array
byte[] source = Encoding.Unicode.GetBytes(text);

// convert that byte array to the new codepage. 
byte[] converted = Encoding.Convert(Encoding.Unicode, encoding, source);

// take multi-byte characters and encode them as separate ascii characters 
foreach (byte b in converted)
    builder.Append((char)b);

// return the result
string result = builder.ToString();

简单来说,就是将包含郓等汉字的字符串转换为ài。

例如,该汉字十进制为37126,十六进制为0x9106。

See http://unicodelookup.com/#0x9106/1 http://unicodelookup.com/#0x9106/1

转换为字节数组,我们得到 [145, 6] (145 * 256 + 6 = 37126)。当以 CodePage 936(简体中文)编码时,我们得到 [224, 105]。如果我们将这个字节数组分解为单个字符,则在 unicode 中我们可以得到 224=e0=à 和 105=69=i。

See http://unicodelookup.com/#0x00e0/1 http://unicodelookup.com/#0x00e0/1 and http://unicodelookup.com/#0x0069/1 http://unicodelookup.com/#0x0069/1

因此,我们正在进行编码转换并确保输出 Unicode 字符串中的所有字符都可以使用最多两个字节来表示。

更新:我需要这个最终表示,因为这是我的收据打印机接受的格式。我花了很长时间才弄清楚! :) 由于我不是编码专家,我正在寻找更简单或更快的代码,但输出必须保持不变。

更新(清洁版本):

return Encoding.GetEncoding("ISO-8859-1").GetString(Encoding.GetEncoding(936).GetBytes(text));

嗯,一方面,您不需要在调用之前将“内置”字符串表示形式转换为字节数组Encoding.Convert.

你可以这样做:

byte[] converted = Encoding.GetEncoding(936).GetBytes(text);

然后,要从该字节数组重建一个字符串,从而将 char 值直接映射到字节,您可以这样做......

static string MangleTextForReceiptPrinter(string text) {
    return new string(
        Encoding.GetEncoding(936)
            .GetBytes(text)
            .Select(b => (char) b)
            .ToArray());
}

我不会太担心效率;无论如何,您要在收据打印机上打印多少MB/秒?

Joe https://stackoverflow.com/users/13087/joe指出有一种编码可以直接将字节值 0-255 映射到代码点,而且它已经很古老了Latin1 http://en.wikipedia.org/wiki/ISO/IEC_8859-1,这使我们能够将函数缩短为...

return Encoding.GetEncoding("Latin1").GetString(
           Encoding.GetEncoding(936).GetBytes(text)
       );

顺便说一句,如果这是一个有缺陷的仅限 Windows 的 API(从外观来看确实如此),那么您might正在处理代码页 1252 http://en.wikipedia.org/wiki/Windows-1252相反(几乎相同)。你可以尝试反射器 http://www.red-gate.com/products/reflector/在通过网络发送 System.String 之前查看它对 System.String 做了什么。

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

我们可以简化这个字符串编码代码吗 的相关文章

  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • 从时间列表中查找最接近的时间

    所以 这是场景 我有一个带有创建时间的文件 我想从该文件的创建时间最接近或相等的时间列表中选择一个时间 完成此操作的最佳方法是什么 var closestTime listOfTimes OrderBy t gt Math Abs t fi
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 名称查找、实例化点 (POI) 和基本类型

    以下代码针对 X 进行编译 但不适用于 double struct X void foo double void foo X namespace NN struct A void foo A foo double error foo not
  • 如果在代码中添加元素,“FindName”将不起作用

    在 WPF 应用程序中 如果在 XAML 中声明 ContentControl
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 不使用放置 new 返回的指针时的 C++ 严格别名

    这可能会导致未定义的行为吗 uint8 t storage 4 We assume storage is properly aligned here int32 t intPtr new void storage int32 t 4 I k
  • 值和类型的简洁双向静态 1:1 映射

    我将从我想象如何使用我想要创建的代码开始 它不必完全像这样 但它是我在标题中所说的 简洁 的一个很好的例子 就我而言 它是将类型映射到相关的枚举值 struct bar foo
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel
  • Emacs C++,打开相应的头文件

    我是 emacs 新手 我想知道 是否有在头文件 源文件和相应的源文件 头文件之间切换的快捷方式 是否有像通用 emacs 参考卡那样的参考卡 Thanks There s ff find other file 您可以使用以下方法将其绑定到

随机推荐

  • Firefox 扩展如何以编程方式获取自己的版本号?

    如何使用 Javascript 以编程方式获取我自己的 Firefox 扩展版本号 我的扩展有一个 install rdf 文件 其中包含类似于下面的版本号 我想提取其中的内容
  • CMYK颜色直接转HSV颜色

    如何将HSV颜色直接转换为CMYK颜色 提及做到这一点的 JavaScript 库会加分 我只见过将 HSV 转换为 RGB 然后将 RGB 转换为 CMYK 的解决方案 我知道的唯一解决方案是转换为 RGB 作为中间层 然后将其转换为您想
  • 配置 WCF 服务以接受不合格参数

    我的 WCF 服务无法识别以不合格形式发送的请求参数值 而是替换为默认值 例如 此请求将产生 您输入 21 的结果
  • 如何重新配置​​ Meteor 的 Facebook 账户,或者 Meteor 的 Facebook 配置在哪里?

    流星的accounts facebook包的设置非常容易 为了输入 Facebook 应用程序 ID 和秘密令牌 我在浏览器中加载了 Meteor Web 应用程序 单击登录按钮 然后单击 配置 Facebook 它要求我提供应用程序 ID
  • C# ASP.NET 列表视图

    我正在尝试创建一个包含多个产品列表的视图 下面的示例展示了产品列表的外观 我不确定是否应该使用表格并为每个新产品或其他内容创建一个新表格 我不是一个很好的 ASP NET 开发人员 我不知道如何解决这个问题 基本上 如果我有 10 个结果
  • JS中的罗马到整数为什么只转换第一个字符

    我尝试解决Leedcode问题13 问题是给定一个罗马数字 将其转换为整数 输入保证在1到3999的范围内 这是我的代码 我想知道为什么它只将罗马数字中的第一个字符转换为整数 var romanToInt function s var re
  • 使用 mod_rewrite 将所有流量重定向到 index.php

    我正在尝试构建一个 url 缩短器 并且我希望能够在域之后立即获取任何字符并将它们作为变量 url 传递 例如 http google com asdf http google com asdf 会成为 http www google co
  • 从数据库中选择最受欢迎的地点的算法

    我们有一个包含地点数据库的网站 对于每个地方 我们的用户都可以执行我们记录的以下操作之一 查看 查看其个人资料 评级 按 1 5 星的等级对其进行评级 审查 审查它 已完成 标记他们已经去过那里 愿望清单 标记他们想去那里 最喜欢的 标记这
  • 实体框架,更新前值的触发机制

    EF 中是否有在更新对象值之前具有的内容 例如当实体对象 假设用户 被保存时 我想在更新用户对象值之前了解日志记录的目的 Thanks 如果您与ObjectContext edmx 您可以订阅SavingChanges http msdn
  • 为什么我无法实例化 switch-case 块内的对象

    我的代码有 3 个类 n hexa n octa n bin 代码在这里 switch choice case 1 cin gt gt n n hexa nx n break case 2 cin gt gt n n octa no n b
  • 如何使用 gulp 在浏览器中进行刷新

    我有一个应用程序在 iis 中 它是一个用 angularjs 和 webapi C 2 0 制作的应用程序 我想创建一个任务 在保存任何 js 文件后立即更新浏览器 吞咽版本 3 9 1 gulp task livereload func
  • 尝试在本地环境中调试 LeetCode 答案时出错

    我正在研究 LeetCode 问题199 二叉树右侧视图 https leetcode com problems binary tree right side view 给定二叉树的根 想象自己站在它的右侧 返回您可以看到从上到下排序的节点
  • 无法使用通过 VS2010 发布在 Windows Azure 上发布网站

    当我尝试通过 Visual Studio 2010 在 Windows Azure 上发布我的 Web 应用程序时 我遇到了这个问题 我尝试右键单击项目并选择发布并导入从 Windows Azure 平台下载的发布配置文件 我收到此错误 错
  • 加入多个文件

    我正在使用标准连接命令来连接两个基于column1 的排序文件 命令很简单 join file1 file2 gt output file 但是如何使用相同的技术连接 3 个或更多文件呢 连接 file1 file2 file3 gt 输出
  • 在运行时根据输入从属性文件中获取值 - java Spring

    我的 color properties 文件为 rose red lily white jasmine pink 我需要获取颜色值 String flower runTimeFlower Value flower String colour
  • Playframework 2.0.x 是否支持模板中的

    不知道play 2 0 3及更高版本是否支持else if在视图中 我只读到必须这样编码 if else if else 不敢相信 我在第二个 if 之前使用了 if true else if true else
  • 使用 nltk 没有上下文的词性标记

    有没有一种简单的方法来确定给定单词最可能的词性标签没有上下文使用nltk 或者如果不使用任何其他工具 数据集 我尝试使用 wordnet 但似乎 sysnet 不是按可能性排序的 gt gt gt wn synsets says Synse
  • Android计算器-Editview无法输入小数位

    我是Android代码开发新手 我正在开发一个Android计算器应用程序 不明白为什么两个EditText 第一个输入和第二个输入 不能接受小数位而只能输入整数 附如下是代码 Thanks 主要活动 package com trial j
  • 将 ScriptableObjects 加载到单个预制件/多个预制件的最佳实践是什么?

    脚本化对象 SO 我最近一直在尝试了解 ScriptableObjects 并在 Unity 中建立了一个项目 我只想射击生成的传入敌人 我已经设置了它 这样我就可以通过 SO s 创建不同的敌人 但注意到我仍然需要为每个敌人创建一个预制件
  • 我们可以简化这个字符串编码代码吗

    是否可以将此代码简化为更干净 更快的形式 StringBuilder builder new StringBuilder var encoding Encoding GetEncoding 936 convert the text into