我正在尝试使用i18n在java中使用来自互联网的示例ttf文件来使用devanagari / hindi。
我能够加载资源包条目并加载ttf和设置字体,但它不会根据需要呈现jlabel。它显示了代替字符的块。如果我在eclipse中调试,我可以将鼠标悬停在unicode变量上,甚至可以渲染devanagari。下面是代码和资源包供参考。
package i18n;
import java.awt.Font;
import java.awt.GridLayout;
import java.io.InputStream;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MyNumbers extends JFrame {
private ResourceBundle rb;
private Font devanagariFont;
public MyNumbers (String language, String fontFile) {
loadResourceBundle(language);
loadFont(fontFile);
display();
}
private void display() {
String unicode = null;
JPanel labels = new JPanel(new GridLayout(0,2));
JLabel uni = null;
for(int i=0; i<=10; i++) {
unicode = rb.getString("" +i);
labels.add(new JLabel("" + i));
labels.add(uni = new JLabel(unicode));
uni.setFont(devanagariFont);
}
getContentPane().add(labels);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
pack();
setVisible(true);
}
private void loadFont(String fontFile) {
try {
InputStream input = getClass().getResourceAsStream(fontFile);
Font b = Font.createFont(Font.TRUETYPE_FONT, input);
devanagariFont = b.deriveFont(Font.PLAIN, 11);
} catch(Exception e) {
e.printStackTrace();
}
}
private void loadResourceBundle(String language) {
String base = getClass().getName() + "rb";
rb = ResourceBundle.getBundle(base, new Locale(language));
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new MyNumbers("hi", "Devnew.ttf");
}
}
这是我创建的MyNumbersrb_hi.properties的资源包。
Default properties in Devnagari
0=\u0915\u0916\u0917:
1=\u090f\u0915:
2=\u0926\u094b:
3=\u0924\u0940\u0907:
4=\u091a\u093e\u0930:
5=\u092a\u093e\u091a:
6=\u091b\u0947:
7=\u0938\u093e\u0924:
8=\u0906\u093e\u0920:
9=\u0928\u094c:
10=\u0926\u0938:
random=Random
title=Key in numbers to match the words
答案 0 :(得分:0)
尝试使用此https://stackoverflow.com/a/6995374/466250 正如原始问题所说,默认情况下属性文件是ISO-8859-1。
答案 1 :(得分:0)
只是不要在unicode的标签上设置字体,默认字体能够正常渲染。
答案 2 :(得分:0)
尝试运行SymbolText小程序,选择900范围,然后选择您要使用的字体。将结果与选择标准字体(如Devanagari MT)进行比较。您的字体版本与JVM上的TrueType实现之间可能存在不兼容。
尝试调用getFontName(),getNumGlyphs(),canDisplay()和canDisplayUpTo()来验证您加载的字体是否符合预期。
既然您知道Eclipse可以呈现Devanagari,请尝试识别并使用Eclipse使用的字体(如果需要)。
答案 3 :(得分:0)
使用utf-8加载资源
ResourceBundle messages = ResourceBundle.getBundle(“resources / MenuBarResources”,locale,new UTF8Control());
public class UTF8Control extends Control {
public ResourceBundle newBundle
(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException
{
// The below is a copy of the default implementation.
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, "properties");
ResourceBundle bundle = null;
InputStream stream = null;
if (reload) {
URL url = loader.getResource(resourceName);
if (url != null) {
URLConnection connection = url.openConnection();
if (connection != null) {
connection.setUseCaches(false);
stream = connection.getInputStream();
}
}
} else {
stream = loader.getResourceAsStream(resourceName);
}
if (stream != null) {
try {
// Only this line is changed to make it to read properties files as UTF-8.
bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
} finally {
stream.close();
}
}
return bundle;
}
}