安卓系统的Unicode支持

15

我是android的新手。我想知道android是否支持Unicode。如果支持,那么我们如何通过java代码使用它。我已经编写了一个程序。

TextView tv = new TextView(this);
tv.setText("Hello, চন্দন");
setContentView(tv);

孟加拉语的Unicode字符显示成了方框。

谢谢提前。


2
根据更新#257在- http://code.google.com/p/android/issues/detail?id=4153#c257,看起来我们可以考虑从4.2开始支持所有Unicode字体,包括泰卢固语。 - anon
请查看我的回复:https://dev59.com/Rm435IYBdhLWcg3wohtT#39675441 - Monzur
7个回答

35

“支持Unicode”——这只是一个字符编码标准,以正确阅读显示Unicode文本需要同时具备合适的字体和一个能够应用嵌入在字体中规则来正确显示文本的复杂文本渲染引擎。在Windows系统中,使用名为Uniscribe的系统库来完成,苹果操作系统采用ATSUI,Linux系统采用Pango。Android基于Linux,但不幸的是,Google似乎已经删除了处理复杂脚本的部分(这是个相当奇怪的决定,因为大多数Android设备都是用于通信,包括文字)。在其他使用基于Linux操作系统的移动设备上,例如Nokia N9和N900,复杂脚本可以正常工作。

Android还为用户安装额外字体或键盘布局提供了困难,用户需要通过“root”他们的手机或平板电脑才能在不同应用程序中使用它们。

一些Android设备制造商已经自行实现了支持(例如,Sony Ericsson的ST和MT系列手机似乎非常支持天城文和其他印度语言脚本)。在某些Android手机上,印度语脚本将在浏览器中呈现正常,因为浏览器开发者已经添加了自己的支持,但在其他应用程序中将无法工作。

请参阅:http://code.google.com/p/android/issues/detail?id=4153

在Android系统中,要想使用像天城文、泰米尔文、孟加拉文、卡纳达文、旁遮普语、泰卢固语、藏文、高棉文、僧伽罗文、马拉雅拉姆文、缅甸文等脚本的用户,由于该系统存在缺陷,大多数使用该操作系统的设备似乎都不是一个好的选择。

需要修复以支持复杂脚本的部分在Android系统中为libskia.so和libwebcore.so。因此,如果您编写支持印度语言的应用程序,可以尝试用自己修改过的版本替换这些库。


1
非常好的答案,它提供了比我的答案更多的细节。不过有一个错误的地方:“Android也使得用户在没有'rooting'他们的手机或平板电脑的情况下安装其他字体或键盘布局变得困难。”虽然Android确实使得在没有root手机的情况下安装字体变得困难,但是新的键盘布局(和其他输入方法)可以很容易地安装。请参阅他们有关实现输入法的文档以获取详细信息。 - Brian Campbell
@sahaja 你知道如何替换/覆盖系统库吗?听起来我们无法在应用程序内完成。相反,我们必须对设备进行root操作,并替换/system/library中的*.so文件。 - Hieu Rocker

8

Android支持Unicode,但所包含的字体并不涵盖所有的Unicode字符,并且渲染也不支持所有类型的脚本。特别是,所包含的字体仅涵盖西欧(拉丁)、斯拉夫、希腊和CJK字符。即使您安装了新的字体,似乎Android并不能正确地支持一些形式的印度语文本布局,如bug 4153中所述。我对孟加拉语文字体不熟悉,不知道它是否需要像印地语一样的特殊渲染,但如果需要,则即使您安装支持该语言的字体,Android也可能不支持该语言。


为什么安装字体无法在Android上显示孟加拉语(天城文)?如果我们相应地修改字体文件会怎样? - Raulp
3
由于梵文需要专门的字形重新排序支持,因此文本中字符出现的顺序与它们显示的顺序不同。简单更改字体是无法解决问题的,需要使用能够改变字形显示顺序的工具。某些高级字体格式(如AAT和Graphite)支持此功能,但Android系统并不支持这些格式,因此需要特别支持梵文重新排序或添加对其中一种字体格式的支持,以正确显示梵文文本。 - Brian Campbell
西里尔字母和希腊字母确实也属于欧洲。你是不是指西方 - Incnis Mrsi
@IncnisMrsi 是的,我可能想写“西欧”,或者应该只说“拉丁语”。 - Brian Campbell
是的,“Latin” 在我看来可能是最不会出问题的选择。 - Incnis Mrsi

3

1
在布局中创建一个名为list.xml的布局。保留HTML,不要解释。
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:textSize="20sp" >
</TextView>

在你的activity_main.xml中添加一个TextView和一个ListView。
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Large Text"
    android:id="@+id/textView" />
<ListView
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:id="@+id/listView" />

MainActivity.java

public class MainActivity extends AppCompatActivity {        
    ListView listView;
    TextView textView;

    static final String[] BANGLA = new String[] {
            "Barguna District (বরগুনা)",
            "Barisal District (বরিশাল)",
            "Bhola District (ভোলা)",
            "Jhalokati District (ঝালকাঠি)",
            "Patuakhali District (পটুয়াখালী)",
            "Pirojpur District (পিরোজপুর)",
            "Bandarban District (বান্দরবান)",
            "Brahmanbaria District (ব্রাহ্মণবাড়ীয়া)",
            "Chandpur District (চাঁদপুর)",
            "Chittagong District (চট্টগ্রাম)",
            "Comilla District (কুমিল্লা)",
            "Cox's Bazar District (কক্সবাজার)",
            "Feni District (ফেনী)",
            "Khagrachhari District (খাগড়াছড়ি)",
            "Lakshmipur District (লক্ষ্মীপুর)",
            "Noakhali District (নোয়াখালী)",
            "Rangamati District (রাঙ্গামাটি)",
            "Dhaka District (ঢাকা)",
            "Faridpur District (ফরিদপুর)",
            "Gazipur District (গাজীপুর)",
            "Gopalganj District (গোপালগঞ্জ)",
            "Kishoreganj District (কিশোরগঞ্জ)",
            "Madaripur District (মাদারীপুর)",
            "Manikganj District (মানিকগঞ্জ)",
            "Munshiganj District (মুন্সীগঞ্জ)",
            "Narayanganj District (নারায়ণগঞ্জ)",
            "Narsingdi District (নরসিংদী)",
            "Rajbari District (রাজবাড়ী)",
            "Shariatpur District (শরীয়তপুর)",
            "Tangail District (টাঙ্গাইল)",
            "Bagerhat District (বাগেরহাট)",
            "Chuadanga District (চুয়াডাঙ্গা)",
            "Jessore District (যশোর)",
            "Jhenaidah District (ঝিনাইদহ)",
            "Khulna District (খুলনা)",
            "Kushtia District (কুষ্টিয়া)",
            "Magura District (মাগুরা)",
            "Meherpur District (মেহেরপুর)",
            "Narail District (নড়াইল)",
            "Satkhira District (সাতক্ষিরা)",
            "Jamalpur District (জামালপুর)",
            "Mymensingh District (ময়মনসিংহ)",
            "Netrakona District (নেত্রকোনা)",
            "Sherpur District (শেরপুর)",
            "Bogra District (বগুড়া)",
            "Joypurhat District (জয়পুরহাট)",
            "Naogaon District (নওগাঁ)",
            "Natore District (নাটোর)",
            "Chapainawabganj District (নওয়াবগঞ্জ)",
            "Pabna District (পাবনা)",
            "Rajshahi District (রাজশাহী)",
            "Sirajgonj District (সিরাজগঞ্জ)",
            "Dinajpur District (দিনাজপুর)",
            "Gaibandha District (গাইবান্ধা)",
            "Kurigram District (কুড়িগ্রাম)",
            "Lalmonirhat District (লালমনিরহাট)",
            "Nilphamari District (নীলফামারী)",
            "Panchagarh District (পঞ্চগড়)",
            "Rangpur District (রংপুর)",
            "Thakurgaon District (ঠাকুরগাঁও)",
            "Habiganj District (হবিগঞ্জ)",
            "Moulvibazar District (মৌলভীবাজার)",
            "Sunamganj District (সুনামগঞ্জ)",
            "Sylhet District (সিলেট)"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        textView= (TextView)findViewById(R.id.textView);
        textView.setText(Html.fromHtml("বাংলাদেশের জেলা সমূহ"));
        edittext = (EditText)findViewById(R.id.editText);
        imageView= (ImageView)findViewById(R.id.imageView);

        listView=(ListView)findViewById(R.id.listView);

        listView.setAdapter(new ArrayAdapter<String>(this,R.layout.list, BANGLA));

   }
}

希望这能帮到你...

嗨,Monzur,你能否分享在Github上完整可工作的项目?非常感谢。 - SArifin
我已经在安卓手机上创建并测试了这个程序,只需要复制粘贴即可运行。如果有帮助,请标记一下。 - Monzur
优秀的答案,附带一个好的例子。 - Hasitha Jayawardana

1

孟加拉文需要像天城体一样的连字,因此,安卓很难正确地呈现孟加拉文。


1

0

Android原生支持Unicode。但是,你使用的语言可能不被支持。你可以通过查看平台注释来找到每个SDK版本支持的语言列表。


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