VĂN BẢN TEXT

Việc hiển thị các văn bản cùng rất nhiều vẩn đề cần phải chú ý. Trong phần này chúng ta tìm hiểu cách biểu diễn và thao tác trên các xâu văn bản.

1. Sắp xếp văn bản

Sắp xếp các xâu văn bản theo một thứ tự nào đó là vấn đề tương đối đơn giàn, nếu chúng được xây dụng từ các ký tự trong bản mã ASCII (tiếng Anh). Thường ta có thể sử dụng

sl.campareTo (s2) 

để so sánh xâu sl với sl để sắp xếp chúng theo thứ tự từ điển.

Nhưng nếu giữa các xâu có một số chữ thường, chữ in hoa lẫn lộn thì dãy các xâu có thể không được sắp theo thứ tự mà ta mong muốn. Biết rằng, phương thức comparelo 0 trong Java sử dụng bộ mã Unicode để sẳp xếp. Trong bảng mà Unicode, mã của chữ cái thường lớn hơn mã chữ cái in hoa, các chừ có dấu thậm chí còn có mã cao hòn. Ví dụ, dãy gồm năm xâu: “An”, “Áng”, “arma”, “Phe”, “phan” nếu sắp theo thứ tự với phương thức corrpareTo 0 sẽ được dãy:

“An”, “Phe”, “anna”, “phan”, “Áng”

Nhung theo cách sắp xếp của nhiều nước, trong đó có Việt Nam thì chữ Á phải đứng sau A, nghĩa là dãy trên cần phải xếp theo thứ tự như sau:

“An”, “Áng”, “arma”, “phan”, “Phe”

Ngược lại, người sử dụng một số nước khác lại không chấp nhận thứ tự nêu hên, ví dụ Đan Mạch. Theo qui định của họ, chữ cái có dấu (có trọng âm) khác với chữ không có dấu, nghĩa là chữ ‘Á’ phải xếp sau ‘Z\ Do vậy, theo yêu cầu cùa người Đan Mạch, dãy trên phải được xếp theo thư tự như sau:

“An”, “anna”, “phan”, “Phe”, “Áng”

Những vấn đề nêu trên có thể giải quyết được bằng cách sử dụng lớp Collator để đối chiểu. Như thường lệ, ta phải xác định đối tượng khu vực của Locale. Sau đó gọi getlnstance 0 để nhận được đối tượng cùa Collator. Cuối cùng để so sánh ta sử dụng compare ( ) của Collator.

Locale loc = …

Collator coll = Collator.getlnstance(loc); if(coll.compare(si, s2) < 0) //si đứng trước s2

Điều quan trọng hon, lớp Collator cài đặt giao diện Comparator. Vì thế ta có thể sử dụng Collections. sort (strings, coll) để sắp xếp strings theo thứ tự của đối tượng coll.

Hơn nữa, trong lý thuyết sắp xếp từ vựng, người ta còn phân chia sự khác nhau giữa các ký tự thành ba mức: cơ sở, thứ cấp và tam cấp. Ví dụ, trong tiếng Anh, sự khác nhau giữa ‘A’ và ‘Z’ là cơ sở (PRIMARY), sự khác nhau giữa ‘A’ và ‘Á’ là thứ cấp (SECONDARY) và giữa ‘A’ và V là tam cấp (TERTIARY). Hiển nhiên ta có thể đặt lại mức độ cho còng việc sắp xếp.

Việc chọn mức độ Collator. PRIMARY là muốn báo cho hệ thống biết rằng chỉ cần chú ý vào sự khác nhau cơ sờ. Chúng ta hãy xét ví dụ sau.

// Giả sử dụng khu vực cùa những người nói tiếng Anh

String sl = “Angstrom”;

String si = “Angstrom”;

coll.setStrength(Collator.PRIMARY)

if(coll.compare(si, s2) — 0)

System, out.println (“Giống nhau”);                     //in ra “Giống nhau“

else System.out.println(“Khác nhau”); coll.setstrength(Collator.SECONDARY) if(coll.compare(si, s2) = 0)

System.out.println(“Giống nhau”); else System, out. println (“Khác nhau”);         //in ra “Khác nhau“

Vấn đề cuối cùng liên quan đến việc sẳp xếp là các cách thức “phân rấ‘ (decomposition mode). Cách thức hay sử dụng nhất là phân rã chuẩn tắc (canonical decomposition), nó thường được đặt mặc định. Neu ta chọn cách không phàn rã (no decomposition) thì các chữ có dấu sẽ không được tách ra khỏi dạng cơ sở và dấu của chúng. Sự lựa chọn này sẽ giúp cho việc sắp xếp nhanh hom, song chi cho kết quả đúng nếu dãy cần sắp xếp không có các chữ có dấu. Khả năng lựa chọn thứ ba là phân rã hoàn toàn (full decomposition), được sử dụng để phân rã các biến thể cùa Unicode.

Java.text.Collator

  • static Locale[] getAvailableLocales()

Nhận lại một màng các đối tượng của Locale mà Collator hỗ trợ.

  • static Collator getlnstance ()
  • static Collator get Instance (Locale 1)

Đưa lại đối tượng đối sảnh Collator sừ dụng cho khu vực mặc định hay khu vực được cho bời 1

  • int compare(String a, string b)

So sánh hai xâu, cho lại giá trị âm nếu a đứng trước h, bằng 0 nếu a và b đồng nhất với nhau, giá trị dương trong trường hợp ngược lại.

  • boolean equals(String a, string b)

Cho lại giá trị true nếu hai xâu a, b đồng nhất với nhau, ngược lại là false

  • void setstrength(int strength)
  • int getstrength()

Đặt và nhận lại mức độ của bộ đối sánh hiện thời. Tham số strength có thể là một trong các hằng Collator.PRIMARY, Collator.SECONDARY, Collator.TERTIARY.

  • void setdDecomposition(int decomp)

■ int getdDecomposition0

Đặt và lấy ra đối tượng phân tích của bộ đối sánh, deccmp có thể là Collator.NO_DECCMPOSITION, Collator. CANONICALJ3EC(MPOSITION, Collator. EULL_DECCMPOS ITICN.

  • Ranh giãi của các văn bản Text

Một vấn đề rất quan trọng trong xử lý văn bản là phải xác định được các ranh giới (phần tử ngắt) giữa các ký tự, từ, câu và các dòng .

Ngắt từ là ký tự bắt đầu và kết thúc cùa các từ. Trong tiếng Anh, người ta định nghĩa một từ là một dãy các ký tự, trong đó không có dấu cách 1 ‘.Ví dụ, câu

The quick, brown fox jump-ed over the lazy dog. được ngắt bời các dấu cách * dấu V và đấu V thành các từ như sau:

The IquickI , Ibrownl I fox I Ijump-edl loverl ItheI IlazyI IdogI.

Ngắt dòng là các VỊ trí mà ở đó một dòng bị ngắt ờ trên màn hình hoặc ớ trên vãn bản được in ra. Trong vãn bản tiếng Anh, các dòng được ngắt bời một từ trước đó hoặc bời một dấu gạch nối. Lưu ý, các điềm ngẳt dòng là những vị trí mà ờ đó một dòng có thể bị ngắt chú không nhất thiết phải ỉà những điểm mà nó bị ngắt thực sự. Ví dụ, dòng sau có các điểm ngắt

là:

The I quick, I brown I fox I jump-1ed I over I the I lazy I dog.I

Việc xác định ranh giới giữa các ký tự, các từ và các dòng là tưcmg đối đon giàn đổi với ngôn ngữ tiếng Anh, tiếng Việt và nhiều ngôn ngữ của châu Âu, Ả. Tuy nhiên, nó có thể rất phúc tạp đối với một số ngôn ngữ khác, vi dụ như tiếng Hindi.

Tiếp theo chúng ta tìm hiểu về việc ngắt các câu văn bản. Trong tiếng Anh (tiếng Việt), một câu bị ngắt bởi các dấu chấm câu các dấu cảm thán ‘!’ và dấu ‘?\

Ta có thể sử dung lóp Breaklterator để tìm các chỗ ngắt của ký tự, từ, dòng và các câu trong một văn bản. Ta cũng có thể sù dụng chúng để soạn thảo, hiền thị và in các tài liệu văn bản.

locale loc = …;                        // Xác định khu vực của hệ thống

// Xác định đối tượng tách từ

Breaklterator wordlter = Breaklterator.getWordlnstance(loc);

String msg = “The quick, brown fox”;

wordlter. setText (msg);     // Đặt msg vào bộ lặp đề tách các từ

Java.text.BreakIterator

  • static Locale [] getAvailableLocales()

Nhận lại một mảng các đối tượng của Locale mà Breaklterator hồ trợ.

  • static Breaklterator      getcharacterlnstance 0
  • static Breaklterator      getcharacterlnstance (Locale 1)
  • static Breaklterator      getWordlnstance ()
  • static Breaklterator      getWordlnstance (Locale    1)
  • static Breaklterator      getLinelnstance ()
  • static Breaklterator      getLinelnstance (Locale     1)
  • static Breaklterator      getSentencelnstance ()
  • static Breaklterator getSentencelnstance (Locale 1)

Nhận lại bộ lặp để tách các ký tự, từ, dòng và câu theo khu vực mặc định hay khu vực được cho bời 1

  • void setText(String text)
  • void setText(Characterlterator text)
  • CharacterIterator getText()

Đặt và nhận lại văn bản text để phàn tích.

  • ìnt first()

Chuyển về VỊ trí của ranh giới đầu tiên của xâu đang đọc và đua lại chi số của nó.

  • int next()

Chuyển về ranh giới tiếp theo và đưa lại chì số của vị trí đó. Neu đạt đến cuối xâu

thì trả lại Breaklterator.DONE.

  • int previous()

Chuyển về ranh giới phía truớc và đưa lại chì số cùa vị trí đó. Nếu đạt đến đầu xâu thi ưảlại Breaklterator.DONE.

  • int last ()

Chuyển về ranh giới cuối cùng và đưa lại chỉ số cùa vị trí đó.

  • int current()

Cho lại vị trí của ranh giới hiện thời.

  • int next (int n)

Chuyển đến ranh giới thứ n kể từ vị trí hiện thời và trà lại chì số cùa vị trí đó. Nếu n là số âm thì chuyển về phía trước, ngược lại chuyển về phía sau. Nếu đạt đến đầu xâu thì trả lại Breaklterator. DONE.