C# ESC/POS 打印越南语

2023-12-02

我有一个使用 ESC/POS 将收据打印到收据打印机的应用程序。它需要支持多语言。目前,我已经用汉字(繁体和简体)和泰语进行了测试。他们都工作得很好。

但是,当我尝试打印越南语时,某些字符被“?”替换。

这是我的代码:

public static readonly string ESC = "\u001B";
...
...
...
Encoding enc = Encoding.GetEncoding(1258); //vietnamese code page
string content = "Cơm chiên với các loại gia vị truyền thống làm cho lưỡi của bạn";
string toPrint = ESC + "t" + char.ConvertFromUtf32(94) + "\n" + Encoding.GetEncoding("Latin1").GetString(enc.GetBytes(str));  //code page 94 is for vietnamese (WPC1258). It is get from printer

在打印输出中,一些字符已被替换为“?” (见附图)。任何想法?

Print Out

UPDATE

根据 Panagiotis Kanavos 的评论,我尝试了以下方法:

Encoding enc = Encoding.GetEncoding(1258); //vietnamese code page
string content = "Cơm chiên với các loại gia vị truyền thống làm cho lưỡi của bạn";
string newStr = Encoding.GetEncoding("Latin1").GetString(enc.GetBytes(content));
string origStr = enc.GetString(Encoding.GetEncoding("Latin1").GetBytes(newStr));

origStr 包含?。我确认在中文和泰文中,origStr将等于content。但NOT对于越南人来说。任何想法?

UPDATE 2

我决定使用 Panagiotis Kanavos 代码,它是bytesToPrint = enc.GetBytes("\x1Bt\x5E\n" + content);,但它给了我完全相同的结果,其中包含?而不是实际的角色。

这就是我将内容(字符串或字节)发送到打印机的方式。

[DllImport("Winspool.drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool ClosePrinter(IntPtr hPrinter);

[DllImport("Winspool.drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndDocPrinter(IntPtr hPrinter);

[DllImport("Winspool.drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndPagePrinter(IntPtr hPrinter);

[DllImport("Winspool.drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);

[DllImport("Winspool.drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);

[DllImport("Winspool.drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartPagePrinter(IntPtr hPrinter);

[DllImport("Winspool.drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);

public static bool SendBytesToPrinter(string printerName, IntPtr pBytes, int dwCount, string docName = null, string dataType = "RAW")
{
    DOCINFOA di = new DOCINFOA();
    di.pDocName = string.IsNullOrWhiteSpace(docName) ? string.Empty : docName;
    di.pDataType = string.IsNullOrWhiteSpace(dataType) ? "RAW" : dataType;

    IntPtr hPrinter = new IntPtr(0); int dwError = 0, dwWritten = 0; bool bSuccess = false;
    if (OpenPrinter(printerName.Normalize(), out hPrinter, IntPtr.Zero))
    {
        if (StartDocPrinter(hPrinter, 1, di))
        {
            if (StartPagePrinter(hPrinter))
            {
                bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                EndPagePrinter(hPrinter);
            }
            EndDocPrinter(hPrinter);
        }
        ClosePrinter(hPrinter);
    }

    if (bSuccess == false)
        dwError = Marshal.GetLastWin32Error();
    return bSuccess;
}

public static bool SendBytesToPrinter(string printerName, byte[] bytes, string docName)
{
    int dwCount = bytes.Length;
    IntPtr ptrBytes = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(byte)) * bytes.Length);
    try
    {
        Marshal.Copy(bytes, 0, ptrBytes, bytes.Length);
        SendBytesToPrinter(printerName, ptrBytes, dwCount, docName);
    }
    finally { Marshal.FreeCoTaskMem(ptrBytes); }
    return true;
}

public static bool SendStringToPrinter(string printerName, string str, string docName)
{
    int dwCount = str.Length;
    IntPtr ptrBytes = Marshal.StringToCoTaskMemAnsi(str);
    try { SendBytesToPrinter(printerName, ptrBytes, dwCount, docName); }
    finally { Marshal.FreeCoTaskMem(ptrBytes); }
    return true;
}

我找到了答案!这不是我的代码,而是 CodePage 1258 的限制(请参阅将文本转换为拉丁文编码并解码越南语的问题).

问题仍然存在,如何用越南语打印?

有一个名叫 HICULIN 的人设法解决了这个问题(参见将 Unicode 字符打印到 POS 打印机)。希望他能与我们分享他的代码。

干杯, 山姆

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

C# ESC/POS 打印越南语 的相关文章

随机推荐

  • 根据数据表值在 gridview 中设置复选框

    我有一个带有复选框字段和几个绑定字段的 gridview 控件 复选框字段不直接映射到数据库中的字段 相反 我想从数据库中的字段读取值并 选中 一些复选框 例如 给定数据库中的以下数据 gt 数据表 PROCESSED NAME DATE
  • mongoDB 32位2GB限制,最佳实践

    Mongo 新手 在 Windows XP 上运行 32 位 Mongo 2 0 1 目前没有运行 64 位的选项 我想使用 Mongo 来映射减少一组 60 个文件 每个文件都是同一个 20 000 行 x 100 列表的每月快照 理想情
  • Rails 如何显示父对象的属性

    我正在尝试使用 Rails 4 制作一个应用程序 我有 2 个表 user rb 和 profile rb User has one profile Profile belongs to User 用户具有名为 first name 和 l
  • 在函数中传递未知数量的参数

    在我当前的项目中 我必须实现多个函数来处理不同数量的UITextField在我的应用程序的多个屏幕中 我想如果我可以实现一个可以接受任意数量的函数 那么效率会更高UITextField 是否可以在 swift 3 上实现这些功能 Swift
  • ImportError:当我使用系统运行服务时,没有名为“schedule”的模块

    我写了一个脚本叫coinview py它可以运行在linux 当我尝试将其运行为systemd 它会引发错误 error ImportError No module named schedule I use pip3显示时间表 它已经存在
  • 上传文件时未定义索引

    这是我的错误 注意 未定义索引 文件中 C xampp htdocs Project Template1 users index php 第 21 行 注意 未定义索引 文件输入 请在第 23 行 C xampp htdocs Projec
  • 将电子邮件输入到我的 python/flask 应用程序代码中的第一步是什么?

    我正在研究如何制作一个可以直接与电子邮件交互的网络应用程序 就像你会发送到 电子邮件受保护 应用程序会将其分解并确定它来自谁 它们是否在数据库中 主题行是什么等 我正在使用 最熟悉Python和Flask 谁能帮助我开始正确的方向 如何让电
  • 编译/缩小的 jsx 文件比原始文件大

    去掉所有空格后 原始jsx文件大小为189k 编译 缩小后的文件大小 js 为 217k 没有任何依赖项 我已经使用了所有 webpack babel 优化来缩小代码大小 treeshaking 除外 我计划缩短成员变量 函数名称以减少文件
  • 如何使用 XPage Java 代码在自定义控件内设置输入控件的有效方法?

    好吧 这很奇怪 在 XPage 中 我的数据源是一个 Java 对象 托管 bean 或 PageController 我通过 Ext 来使用引导程序 图书馆 我想要做的是将所有验证代码保留在 Java 对象中 而不是将任何内容附加到 XP
  • t-sql,sql表内连接电子表格

    我有一个数据表 AmenityData 该表的一列包含邮政部门 例如E14 7 我还有一个 Excel 电子表格 其中包含邮区列表 例如E14 我需要从 AmenityData 表中获取所有数据 其中邮政区就像邮政部门 例如其中 Posta
  • Flatpak Meson 没有从 Gnome Builder 中找到 Vala 库

    在 Linux 中 我在 Gnome Builder 3 26 4 中使用 Meson 0 44 0 作为将使用 Gee 和 GXml 的控制台程序 我的目的是在 Genie 中写这个 当我在 Gnome Builder 中使用 Meson
  • 在wpf中的列表框中绑定文本框列表

    我必须制作带有文本框的列表框 并且它必须是动态的 我在代码后面有可观察的集合 我想将其绑定到列表框 我想要动态列表框 并且该列表中应该有可编辑的文本框 所以 基本上我想从列表框中绑定 multiplr 文本框 任何帮助 将不胜感激
  • 网络视图 - 获取“共享名称”

    我需要获取某些存储中的所有共享名称 我在用着Net view StorageName它以表格格式显示结果 Share name Type Used as Comment Backups Disk CallRecordings Disk Do
  • Scrapy 中的爬行和连接

    我正在尝试使用 Scrapy 抓取电影列表 我只获取导演和电影标题字段 有时 有两位导演 Scrapy 会将他们视为不同的人 因此 第一位导演将带有电影标题 但第二位导演将没有电影标题 所以我创造了这样的条件 if director2 it
  • Numpy:从 2 个实数创建一个复杂数组?

    我想组合同一数组的两个部分来创建一个复杂的数组 Data 0 Data 1 这些不起作用 x np complex Data 0 Data 1 x complex Data 0 Data 1 我错过了什么吗 numpy 不喜欢对复数执行数组
  • 针对特定指标在张量流中进行优化

    有什么方法我们可以针对特定指标来使用内置进行优化tensorflow优化器 如果没有 如何实现这一目标 例如 如果我只想专注于最大化分类器的 F 分数 是否可以这样做tensorflow estimator tf estimator Lin
  • 如何使Win32对话框出现在默认位置(CW_USEDEFAULT)?

    如何制作 Win32dialog出现在默认位置 大小 即我如何模拟CW USEDEFAULT for CreateWindow当窗口已经创建时 创建一个临时的不可见窗口CW USEDEFAULT并查看它的位置 将对话框移到那里
  • 如何替换 jar 文件中的类文件?

    我的一个同事写了一个课程 他的类使用我的类 他没有在每次编译他的类时告诉 JVM 我的类位于哪里 而是将这两个类打包到一个 jar 文件中 我可以像这样运行该文件 java jar hisclass jar 现在我决定对我的班级进行一些改变
  • ARM 过程调用标准中的 r12

    为什么根据 ARM 过程调用标准将 r12 指定为暂存寄存器 它位于两组保留寄存器之间 r4 r11 和 sp lr pc 为什么不将 r0 r4 临时化并保留其他所有内容 请注意 ARM 有STM and LDM以数字递增 递减顺序存储和
  • C# ESC/POS 打印越南语

    我有一个使用 ESC POS 将收据打印到收据打印机的应用程序 它需要支持多语言 目前 我已经用汉字 繁体和简体 和泰语进行了测试 他们都工作得很好 但是 当我尝试打印越南语时 某些字符被 替换 这是我的代码 public static r