【问题标题】:Unicode characters in app doesn't show correctly [closed]应用程序中的 Unicode 字符无法正确显示 [关闭]
【发布时间】:2015-05-15 16:32:55
【问题描述】:

如何转换这样的字符串,例如"Bohinjska Češnjica"。我从网站获得的字符串,它没有以unicode 编码。它在使用swing(Netbeans)的程序中工作得很好,但是当我将jar链接传递到Windows控制台时(运行jframe应用程序)它不会在字符串"Bohinjska Češnjica"中显示正确的字符@字符987654330@ 和'š'

String example="Bohinjska Češnjica";

我从网站上得到那个字符串。 如何在 Swing 应用程序中编码或显示 ("Bohinjska Češnjica"),所以当我运行 jframe 应用程序时,它会显示这个字符(当然还有其他 unicode 字符('Ž'、'ž'、'č ' 和 'Š'))?

链接 1 :jar file of my program runned from console 链接2:when i run program from netbeans

从网站上阅读内容

             URL nov = new URL("http://www.arso.gov.si/vreme/napovedi%20in%20podatki/vreme_avt.html");
            URLConnection conn = nov.openConnection(); //connect to a   website
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String inputLine;
            StringBuilder niz = new StringBuilder(); 
            while ((inputLine = br.readLine()) != null) {
                String vrstica = inputLine.trim(); //reading html...

}

【问题讨论】:

  • 您是否检查了从网站收到的字符串的编码?
  • 这是纯文本。我很快就会发布图片链接,所以你会明白我的意思。
  • 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。
  • “纯文本”有一个编码。您需要知道该编码才能正确解释它。
  • 我发布了一个代码,从网站上给我 html,然后我用正则表达式提取我需要的信息...

标签: java swing netbeans unicode fonts


【解决方案1】:

尝试使用支持 Unicode 字符的字体,例如 Arial Unicode MS。

【讨论】:

    【解决方案2】:

    在运行时,我们可以使用Font.canDisplayUpTo(String) 来确定哪些已安装的字体可以显示给定的文本。 Font.SANS_SERIFFont.SERIF 等逻辑字体通常由其他字体组成,并且可以涵盖大量不同的脚本。

    这是一个使用给定文本的示例,结果在这台机器上看到。

    顺便说一句 - 谷歌翻译告诉我这是斯洛文尼亚语而不是克罗地亚语,但幸运的是,完全相同的技术适用于任何脚本。

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.border.EmptyBorder;
    import java.util.Vector;
    
    public class CroationTextInGUI {
    
        private JComponent ui = null;
        private String text = "Bohinjska Češnjica";
    
        CroationTextInGUI() {
            initUI();
        }
    
        public void initUI() {
            if (ui!=null) return;
    
            ui = new JPanel(new BorderLayout(4,4));
            ui.setBorder(new EmptyBorder(4,4,4,4));
    
            String[] fontFamilies = GraphicsEnvironment.
                    getLocalGraphicsEnvironment().
                    getAvailableFontFamilyNames();
            Vector<String> croatFreindlyFonts = new Vector<String>();
            for (String name : fontFamilies) {
                Font font = new Font(name, Font.PLAIN, 20);
                if (font.canDisplayUpTo(text)<0) {
                    croatFreindlyFonts.add(name);
                }
            }
            final JList list = new JList(croatFreindlyFonts);
            list.setVisibleRowCount(20);
            list.getSelectionModel().setSelectionMode(
                    ListSelectionModel.SINGLE_SELECTION);
            ui.add(new JScrollPane(list), BorderLayout.LINE_START);
    
            final JTextArea output = new JTextArea(text, 2, 12);
            output.setLineWrap(true);
            output.setWrapStyleWord(true);
            ui.add(new JScrollPane(output));
    
            ListSelectionListener showFontListener = new ListSelectionListener() {
    
                @Override
                public void valueChanged(ListSelectionEvent e) {
                    Font f = new Font(
                            list.getSelectedValue().toString(), Font.PLAIN, 50);
                    output.setFont(f);
                }
            };
            list.addListSelectionListener(showFontListener);
            list.setSelectedIndex(0);
        }
    
        public JComponent getUI() {
            return ui;
        }
    
        public static void main(String[] args) {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (Exception useDefault) {
                    }
                    CroationTextInGUI o = new CroationTextInGUI();
    
                    JFrame f = new JFrame("Croation Text in GUI");
                    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    f.setLocationByPlatform(true);
    
                    f.setContentPane(o.getUI());
                    f.pack();
                    f.setMinimumSize(f.getSize());
    
                    f.setVisible(true);
                }
            };
            SwingUtilities.invokeLater(r);
        }
    }
    

    【讨论】:

    • 问题已更新。当我回到家时,我将发布一个图片链接(它在 netbeans 和 Windows 控制台中的显示方式(当我放置一个 jar 文件的链接并执行时))
    • (1+),我喜欢canDisplayUpTo(...) 方法。绝对简化了任务。
    【解决方案3】:

    BufferedReader br = 新的 BufferedReader( new InputStreamReader(conn.getInputStream(), "UTF-8"));

    【讨论】:

      猜你喜欢
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 2014-02-14
      • 2012-08-08
      • 1970-01-01
      相关资源
      最近更新 更多