Eclipse 打印错误的西里尔字符

Posted

技术标签:

【中文标题】Eclipse 打印错误的西里尔字符【英文标题】:Eclipse printing wrong cyrillic character 【发布时间】:2018-08-30 13:57:04 【问题描述】:

我正在制作一个使用财务打印机的应用程序,并且我发送到打印机的文档必须是西里尔文。问题是一个特定字符(一个用于关税组,因为我正在尝试打印收据)应该是(char)192,但在此过程中不知何故被更改为一些随机字符。我尝试在 Project>Properties>Resource>Text file encoding 下将项目的编码更改为 UTF-8,但没有任何改变。我还尝试将 Window>Preferences>General>Workspace>Text file encoding 中的编码更改为 UTF-8,但仍然没有。

注意:当我在其他机器上手动键入文档然后将其发送到财务打印机时,它可以正常工作(但在我的电脑上却不行)。我使用记事本编辑输出文件类型为.in 的文件。

这里是代码

if(result==JOptionPane.YES_OPTION)
    try 
        PrintWriter writer;
        writer = new PrintWriter("PF500.in");

        String line1 = " 01,0000,1";
        writer.println(line1);
        String etq = "#1";
        String line2 = null;
        String tarifa = null;
        for(Artikli art : list)
            switch(etq)
                case "#1": etq = "$1";
                break;
                default: etq = "#1";
            
            switch(art.tarifa)
                case "0801": tarifa = Character.toString((char)192);
                break;
                case "0701": tarifa = Character.toString((char)193);
                break;
                case "0601": tarifa = Character.toString((char)194);
                break;
            
            line2 = etq + art.name.trim() + Character.toString((char)9) + tarifa + art.cena + "*" + art.kolicina;
            writer.println(line2);
        
        writer.println("%5" + Character.toString((char)9) + "P" + String.valueOf(total));
        writer.println("#" + Character.toString((char)56));

        writer.close();
     catch (FileNotFoundException e1) 
        e1.printStackTrace();
                   

    con.clearSmetka(id);
    con.insertIzvestaj(list, den.date, id, user.name, time, popust);
    dtm1.setRowCount(0);
    smetkaTable.setModel(dtm1);
    btnCloseSmetka.setEnabled(false);   
    btn.setBackground(new Color(0, 128, 128));
    btn.setText("Маса " + String.valueOf(id));
    smetkaTxt.setText("0,00");
    workFrame.dispose();

除了关税组的字符(即 (char)192)之外,一切正常

【问题讨论】:

上述配置仅适用于文本编辑器如何读写文本文件。 (char)192À,对吧?如何将字符发送到打印机? @howgler 是的,没错,它是À。我使用 PrintWriter,然后使用“writer.println()”,字符的行是“tarifa = Character.toString((char)192);” @howlger 而且我还通过我的应用程序调用 finance32.exe 来调用打印机本身。这是制造商提供的 tarifa = Character.toString((char)192); 可以缩短为tarifa = "\u00c0";PrintWriter 如果未在构造函数中设置,则使用默认字符编码(如果是这种情况,请改用 this constructor)。请将 Java 代码添加到您的问题中。目前尚不清楚打印机如何获得À @howlger 我添加了生成 À 的代码。我还注意到有时 Alt+192 会生成这个字符“└”。我正在使用制造商的说明,它说文档应该包含 ASCII 代码 192 【参考方案1】:

问题:

writer = new PrintWriter("PF500.in");

PrintWriter 已创建

which will encode characters using the default charset for this instance of the Java virtual machine.

这意味着在

writer.println(line2);

包含子字符串"À" 的字符串line2(与"\u00c0"Character.toString((char)192) 相同)被转换为基于默认字符集/编码的字节(它本身取决于操作系统的语言设置)。

解决方案:

要直接写入字节192而不转换它,您可以使用FileOutputStream而不是PrintWriter和方法write(int b)
FileOutputStream writer = new FileOutputStream("PF500.in");
...
writer.write('\u00c0');  

如果您想继续使用 PriterWriter,则必须指定打印机使用的编码/字符集PrintWriter(File file, String csn)

通过 -Dfile.encoding=... 运行 Java 时指定打印机的字符集/编码(这可能会导致其他地方出现编码问题)。

作为第四个选项,不推荐,可能有效也可能无效,您可以先进行逆转换:

case "0801": tarifa = new String(new byte[](byte)192);

【讨论】:

检查我的更新。我找到了解决方案,感谢您的支持和您给我的指导。【参考方案2】:

    不要写tarifa = Character.toString((char)192);,反正超级难懂,直接写你想要的字符:tarifa = "À";

    当你打印一个字符串时,它是如何构造的以及你用来构造它的编码是完全无关的。 Java 字符串有一个内部字符表示,它独立于创建它们时使用的编码或从它们获取原始数据时使用的编码。创建PrintWriter 时,您使用的构造函数使用系统的默认编码。该编码是这里的症结所在。无论该编码是什么,它显然与您的财务打印机不兼容。您应该找出打印机期望的编码,然后专门使用该编码构造您的PrintWriter

    writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream("PF500.in"), "CHARSET_NAME"));

【讨论】:

我试过了,不行。我还打印了我要发送到文件的字符的 ascii 值,它是正确的 - 192。但不知何故,财政打印机仍然无法识别它。顺便说一下财务打印机工作正常,我在其他机器上测试过【参考方案3】:

解决方案

好的,所以过了一段时间我终于发现了问题:这里我将PrintWriter更改为Writer,并在以下行中将FileOutputStream的编码设置为“Cp1252”:

Writer writer = new BufferedWriter(new OutputStreamWriter( 新文件输出流(“PF500.in”),“Cp1252”)); 现在它工作正常。事实证明,出于我仍然未知的原因,该文件是使用 utf-8 编码保存的,并且财务打印机无法识别所有字符,因此收据有问题。改编码为“Cp1252”后,流程正常。

【讨论】:

以上是关于Eclipse 打印错误的西里尔字符的主要内容,如果未能解决你的问题,请参考以下文章

怎么解决这个问题啊,华为 u8860 4.0.3的系统android程序真机调试,eclipse的logcat无法打印错误信息

eclipse 中怎么全局搜索存在的xml错误

Eclipse GitLab 克隆问题“格式错误的输入或不可映射的字符”

eclipse cdt 中的‘字符串’没有命名类型错误”

Java“常量字符串太长”编译错误。仅在使用 Ant 时发生,在使用 Eclipse 时不会发生

在eclipse上链接.so文件