在TextView中显示所有Unicode字符

15

有没有办法在我的手机上的 TextView 中显示所有 Unicode 字符?

我尝试了像 '\u0279' 这样的特殊字符,但我得到了一个方框(默认字符)。 这是基于本地化和国际化设置吗?


你是在Strings.xml文件中添加这些字符吗? - mudit
假设我想要进行简单的转换,将(utf8)数字(例如0279)转换为(utf8)字符'\u0279'。因此,我有一个EditText,用户在其中写下数字,并且有一个TextView,在其中这些数字被转换为字符。通过按下按钮完成转换。 - zmeda
为此,您必须记录所有相应符号的可用字符代码。将其与记录进行比较,然后显示该符号。 - mudit
抱歉,我不明白你所说的“having record”的意思。你能在回答中发布一段示例代码吗? - zmeda
抱歉记录的事情有些混乱。请检查我的答案。 - mudit
一个方块通常意味着没有可用的字体可以呈现所需的字形(或选择的字体无法显示它且没有使用回退)。很少有系统能够显示所有Unicode字符。 - Joachim Sauer
3个回答

14
tv=(TextView)findViewById(R.id.textView1);
Typeface font= Typeface.createFromAsset(getAssets(), "TAU_BHON.TTF");
tv.setTypeface(font); 

将支持您语言的字体放置在assets文件夹中。 在这种情况下,我使用的是TAU_BHON.TTF。


1
我收到错误信息 java.lang.RuntimeException: Unable to start activity ComponentInfo{mypackage/mypackage.MyActivity}: java.lang.RuntimeException: native typeface cannot be made。 - zmeda
1
我已经成功从资产中加载了字体,但仍然出现了丑陋的方框而不是正确的字符。 - zmeda
你是如何确定需要哪种字体的? - AdamMc331
@McAdam331 每种字体都支持不同的Unicode字符,没有一种字体支持所有字符。您需要选择一个支持您想使用的字符的字体。 - Tristan Wiley
@TristanWiley 我的问题是,我如何确定支持我想使用的字符的字体? - AdamMc331
你可以检查一下字体,看看它们是否有效。许多字体支持很多字符,所以我建议使用那些尝试。 - Tristan Wiley

13

通常这是由于所使用的字体原因, 默认字体不支持/未实现所有的Unicode字符,您需要使用完整功能的字体,例如DejaVuSans.ttf

@sakthi提供了一个样例,应该可以无问题地工作,检查一下您的Android版本是否支持它。


我已经成功从资产中加载了字体,但仍然显示这个丑陋的方框,而不是正确的字符。 - zmeda
检查您使用的字体是否具有您需要的字符。 - yeradis
好的,现在我正在使用DejaVuSans.ttf字体,现在几乎完美运行(并非所有字符都显示为所需,但没问题)。谢谢。 - zmeda
但问题是Dejavu字体很大(>230KB)。 - emeraldhieu
@yeradis,感谢您提供的字体(DejaVuSans.ttf),我曾经为此问题苦苦挣扎,试了很多字体,几乎要放弃了。非常感谢。顺便问一下,除了DejaVuSans.ttf,还有更好的字体选择吗? - LiangWang
显示剩余2条评论

11

尝试这段代码:

String str = "\u00F6";

System.out.println("new value-" + str);

你将获得:

new value-ö

这是我创建的一个样例 Android 项目,用于检查该功能:

Java 文件:

package com.testd;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class Main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String str = "\u00F6";

        TextView tv = (TextView) findViewById(R.id.a);
        tv.setText("sajklasdklfjasdf " + str );
    }
}

XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView android:id="@+id/a" android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:text="@string/hello" />
</LinearLayout>

屏幕截图:

在此输入图片描述


这一切都是真的,但问题在于我的TextView没有以正确的方式显示它。它使用方框而不是正确的字符。 - zmeda
1
这行代码 String s = new String(str); 没有任何实际作用。它只是创建了一个新的 String,其内容与 s 相同。只有极少数情况下,只接受一个 String 参数的 String 构造函数才是有用的。但这不是其中之一。 - Joachim Sauer
这段代码对我也有效,但如果你使用"\u2040"而不是"\u00F6",它就不再起作用了。 - zmeda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接