Unicode emoji, aksen, teks internasional

Unicode emoji, aksen, teks internasional

Sebelum menganalisis teks di R, Anda harus terlebih dahulu mendapatkan ekspresi digital, yaitu, 1 dan 0 urutan. Sebenarnya, ini beroperasi dengan terlebih dahulu pilih pengkodean untuk teks, yang memberikan nilai numerik untuk setiap karakter, dan kemudian mengonversi string karakter dalam teks ke string yang sesuai yang ditentukan dalam pengkodean. Saat ini, sebagian besar teks baru dikodekan sesuai dengan standar Unicode, terutama format transfer unicode 8-bit dan UTF-8. Joel Sportsky menjelaskan esai tahun 2003 sebagai gambaran tentang situasi ini.

Komunitas perangkat lunak telah bermigrasi ke UTF-8 sebagai standar untuk menyimpan dan bertukar teks, tetapi masih ada banyak buku teks penyandian lainnya. Saat membaca file teks di R, Anda harus menentukan pengkodean. Jika tidak ditentukan, R akan mencoba menebak pengkodean, dan jika tebakannya salah, urutan 1 dan 0 akan ditafsirkan secara tidak sengaja.

Tunjukkan kesulitan pengkodean menggunakan buku teks novel Jane Austin “Mansfield Park” yang disediakan oleh Project Gutenberg. Unduh teks dan baca baris novel.

#Project Gutenberg Unduh Zi p-Kompress Teks dari situs Mirror. Url "Http://mirror. csclub. uwaterloo. ca/gutenberg/1/4/141/141. zip" TMP File Tempolar() Unduh file(URL, TMP)  #Pread Text dari file zip Selamat unz(TMP,"141. txt", Encoding = "UTF-8") Jumlah baris Jumlah baris baca(MENIPU) menutup(MENIPU)

Fungsi UNZ dan fungsi koneksi file serupa lainnya memiliki argumen pengkodean, dengan asumsi bahwa teks dikodekan oleh pengkodean asli sistem operasi secara default. Opsi ini harus secara eksplisit diatur untuk menjamin operasi yang konsisten di semua platform (Mac, Windows, Linux). Di sini, encoding = “UTF-8”. Ini adalah default yang masuk akal, tetapi tidak selalu sesuai. Secara umum, Anda harus melihat file dan menentukan nilai penyandian yang sesuai. Sayangnya, ekstensi file “. txt” mungkin tidak membantu dan mungkin kompatibel dengan pengkodean apa pun. Namun, ketika Anda membaca beberapa baris pertama file, sepertinya:

Garis [11:20]
 [1] "Penulis Jane Austin" [2] "" [3] "Tanggal rilis: Juni 1994 [Etext #141]" [4] "Diposting: 11 Februari 2015" [5] "" [6] "Bahasa: Bahasa Inggris "[7]" "[8]" Karakter Set Pengkodean: ASCII "[9]" "[10]" *** Mulai dari proyek ini Gutenberg ebook Mansfield Park ***

Pengkodean set karakter dilaporkan sebagai ASCII, subset dari UTF-8. Jadi itu harus berhasil.

Namun sayangnya, jika Anda mencoba memproses buku teks, Anda akan segera menyebabkan masalah:

Coops::Term_stats(Garis)#Sero
Kesalahan dalam corpus :: term_stats (baris): Entri argumen 15252 ditandai secara tidak benar sebagai "UTF-8": tidak valid paruh waktu teratas (0xa3) pada posisi 36

Pesan kesalahan menunjukkan bahwa baris 15252 berisi byte yang tidak valid.

Garis [15252]
[1] "Siapa pun yang dapat memuaskan urutan kecantikan dan masalahnya."

Anda mungkin berpikir bahwa ada baris lain yang termasuk data tidak valid. Dengan fungsi UTF8_VALID, Anda dapat menemukan semua baris seperti itu:

Garis [!UTF8_VALIDgaris
[1] "Siapa pun yang dapat memuaskan urutan kecantikan dan masalahnya."

Dengan kata lain, tidak ada garis tidak valid lainnya.

Pekerjaan bagia n-waktu yang tidak valid pada baris 15252 ditampilkan sebagai “˶ xxa3”, yang merupakan kode pelarian dengan nilai heksadesimal 0xA3 dan nilai 10 0-margin dari 163. Untuk memahami mengapa ini tidak valid, Anda perlu mempelajari lebih lanjut tentang pengkodean UTF-8.

UTF-8

ASCII

Unit minimum transfer data di komputer modern adalah byte, dan angka antara 0 dan 255 (1 6-March 0x00 dan 0xff) dapat dikodekan dalam pengaturan 8 dan 0. Dalam pengkodean karakter awal, angk a-angka dari 0 hingga 127 (1 6-March 0x00 hingga 0x7f) distandarisasi dalam pengkodean yang dikenal sebagai ASCII (Kode Standar Amerika untuk Informasi Interchange). Berikut ini adalah karakter yang sesuai dengan kode ini:

Tali matriks(0:127, 8, 16, Byrow = BENAR,  DIMNAME = daftar(0:7, c(0:9karakter[1:6]))) ASCII Melamar(Kode,c(1, 2), Inttoutf8)  # Ganti kode kontrol dengan "" ASCII ["0", c(0:6, "E", "F")]  "" ASCII ["1",]  "" ASCII ["7", "F"]  ""  UTF8_PRINT(ASCII,QUOTE = PALSU)
 0 1 2 3 5 5 6 7 8 9 A B C D EF 0 ♪ A ♪ B ♪ T ♪ N ♪ V ♪ F ♪ R ♪ 1 2! " # $ % & Amp; '() * +,. / 3 0 1 2 3 6 6 7 7 8: 9: ;;< = >?< | >~ 

32 kode pertama (dua baris pertama dalam tabel) adalah kode kontrol khusus, yang menunjukkan 0x0a yang paling umum (\ n). Kode khusus 0x00 sering menunjukkan akhir input, dan R tidak mengizinkan nilai ini dalam string. Kode 0x7F mendukung kontrol “Hapus”.

Memanggil utf8_print menggunakan kode kontrol pemformatan subrutin utf8_encode tingkat rendah:

UTF8_PRINT(intToUtf8(1:0x0f), QUOTE = PALSU)
[1] \u0001\u0002\u0003\u0004\u0005\u0006\a\b\t

\v\f

\u000e\u00f(intToUtf8(1:0x0f), QUOTE = PALSU)
kutipan =

PALSU

Latin-1

[1] \001\002\003\004\005\006\a\b\t

Tali matriks(128:255, 8, 16, Byrow = BENAR,  DIMNAME = daftar(c(8:9karakter[1:6]), c(0:9karakter[1:6]))) nama dim = Melamar(Kode,c(1, 2), Inttoutf8)  # Ganti kode kontrol dengan "" menerapkanc((Kode, ), intToUtf8)),]  ""  UTF8_PRINTlatin1[QUOTE = PALSU)
 utf8_print

(latin1,

Garis [15252]
[1] "Siapa pun yang dapat memuaskan urutan kecantikan dan masalahnya."

0 1 2 3 4 5 6 7 8 9 a b c d e f 8 9 a ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª “ ¬ ® ¯ b ° ± ² ³ ´ µ ¶ -¸ ¹ º ” ¼ ½ ¾ ¿ c À Á Â Ã Ä Å Æ Ç È É ÊÊ d Г Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý ß e à á â ã ä å æ ç è é ê ë ì í ï f ð ñ ò ó ô õ ö ö ± ø ù ú û ü ý ÿ

Seperti halnya ASCII, 32 angka pertama adalah kode kontrol. Yang lainnya adalah huruf yang biasa digunakan dalam bahasa Latin. Perhatikan bahwa byte Mansfield Park yang tidak valid, 0xa3, sesuai dengan tanda pound dalam pengkodean Latin-1. Mengingat konteks pekerjaan paruh waktu

baris([1] "Dengan kecantikannya", "siapa pun yang bisa memuaskannya" ΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓΓ(), n = 20)
 Ini mungkin simbol yang benar. Teks ini kemungkinan besar dikodekan dalam Latin-1, bukan UTF-8 atau ASCII seperti yang diklaim file. 

UTF-8

Jika Anda mengalami kesalahan saat membaca teks yang mengklaim sebagai ASCII, kemungkinan teks tersebut dikodekan dalam Latin-1. Namun ini bukanlah satu-satunya kemungkinan. Fungsi iconvlist mencantumkan hal-hal yang R tahu cara menanganinya:

kepala

daftar ikonv [1] “437” “850” “852” “855” [5] “857” “860” “861” “862” [9] “863” “865” “866” “869” [13] “ansi_x3 . 4-1968” “ansi_x3. 4-1986” “arab” “armscii-8” [17] “ascii” “asmo-708” “atari” “atarist”
Karena nilai unik hanya 256, semua karakter tidak dapat dikodekan dengan satu byte. Pengkodean mult i-byte memungkinkan Anda untuk menyandikan lebih banyak karakter. UTF-8 mengkodekan karakter dengan kode karakter 1-byter dan dapat menggunakan kode karakter hingga 1. 112. 064. Sebagian besar kode ini saat ini unit, tetapi konsorsium Unicode mengadakan pertemuan setiap tahun dan menambahkan sura t-surat baru. Anda dapat menemukan semua daftar karakter dalam database karakter Unicode. Daftar emoji tersedia secara terpisah. Misalkan Anda ingin memasukkan Kode 1 6-margin 0x2603 Karakter Unicode. Anda dapat memasukkan salah satu dari tiga berikut:
intToUtf8(#Howxidal nomor 4 digit) "\ U00002603"

#Hear 1 6-Maret 8 digit

inttoutf8

\u000e\u00f(intToUtf8(Metode pertama tidak berfungsi dengan 0xFFFFF atau karakter yang lebih tinggi. Windows tidak dapat menggunakan metode kedua karena versi R saat ini (dimodifikasi oleh R-devel). + 0:79)) Jika Anda mencoba mencetak Unicode dengan R, sistem pertam a-tama menentukan apakah kode dapat dicetak. Kode yang dapat dicetak termasuk kode kontrol dan kode yang tidak diinginkan. Pada Mac OS, R menggunakan fungsi lama untuk penilaian ini dan tidak dapat mencetak sebagian besar emotikon. Fungsi UTF8_PRINT menggunakan versi terbaru standar Unicode (10. 0. 0) dan menampilkan semua karakter Unicode yang didukung oleh sistem Anda:
pencetakan
UTF8_PRINT(intToUtf8(Metode pertama tidak berfungsi dengan 0xFFFFF atau karakter yang lebih tinggi. Windows tidak dapat menggunakan metode kedua karena versi R saat ini (dimodifikasi oleh R-devel). + 0:79)) [1] "\ u0001f600 \ u0001f602 \ u0001f603 \ u0001f604 \ u0001f605 \ u0001f607 \ u0001f609 \ u0001f609 \ u0001f60b \ U0001f60c 1f610 \ u0001f610 \ u0001f611 \ u0001f612 \ u0001f613 \ u0001f615 u0001f615 u0001f615 u0001f615 \ u0001f615 u000f616 \ u0001f617 \ U0001f618 \ u0001f619 \ u0001f619 \ u0001f61b \ u0001f61b \ u0001f61c \ u0001f61c \ u0001f61f621f61e \ u0001f620 \ u0001f6f621f61e \ u0001f620 \ u0001f6f621f62 \ U0001f621 \ u0001f621 u0001f622 \ u0001f623 \ u0001f625 \ u0001f627 \ u0001f628 \ u0001f629 \ u0001f62b \ u0001f62c u0001f62c 1f62d \ u0001f62e \ u0001f62f \ u0001f630 \ u0001f631 \ u0001f632 \ u0001f633 \ u0001f634 \ u0001f637 \ u0001f635 \ u0001f633 0001f63a \ u0001f63a \ u0001f63a \ u0001f63a \ u0001f63b \ u0001f63d \ u0001f63e \ u0001f640 \ u0001f641 \ u0001f642 \ u0001f644 \44141 \ u0001f642 \ u0001f644 \4414141 U0001f645 1f646 \ u0001f647 \ u0001f648 \ u0001f649 \ u0001f64a \ u0001f64b \ u0001f64c \ u0001f64d \ u000f64e \ u0001f64f
UTF8_PRINT(intToUtf8(Metode pertama tidak berfungsi dengan 0xFFFFF atau karakter yang lebih tinggi. Windows tidak dapat menggunakan metode kedua karena versi R saat ini (dimodifikasi oleh R-devel). + 0:79), # Kurangi dengan lebar garis 500) UTF8_PRINT

inttoutf8

0x1f600

  • Chars =
  • # Tingkatkan jumlah batas karakter
  • (Karakter dengan kode dengan 0xFFFFF atau lebih, termasuk sebagian besar emotikon, tidak didukung pada windows).
  • Paket UTF8 menyediakan utilitas berikut untuk verifikasi, pemformatan, dan pencetakan karakter UTF-8:
  • As_utf8 () mencoba untuk mengonversi data karakter ke UTF-8, dan jika data tidak valid, melempar kesalahan;
  • UTF8_VALID () menguji apakah data karakter efektif sesuai dengan pengkodean yang dinyatakan;
  • UTF8_Normalize () mengubah teks menjadi Formulir Reguler Konfigurasi Unicode (NFC) dan menerapkan peta yang kompatibel dengan lipat dan kompatibel dengan huruf besar;

UTF8_ENCODE () mengkodekan string dan lolos dari semua karakter kontrol;

Translating to UTF-8

UTF8_FORMAT () membentuk vektor karakter dengan mengurangi batas lebar karakter yang ditentukan, penyelarasan kiri, penyelarasan kanan, dan penyelarasan pusat;

Coops::Term_statsUTF8_WIDTH () mengukur lebar tampilan string karakter UTF-8 (banyak emotikon dan huruf Asia Timur dua kali lebih besar dari karakter lain). Paket ini tidak menyediakan metode untuk dikonversi dari pengkodean lain ke UTF-8.
Kesalahan dalam corpus :: term_stats (baris): Entri argumen 15252 ditandai secara tidak benar sebagai "UTF-8": tidak valid paruh waktu teratas (0xa3) pada posisi 36

Coops

Garis [15252]
[1] "Siapa pun yang dapat memuaskan urutan kecantikan dan masalahnya."

Kesalahan dalam corpus :: term_stats (baris): Entri argumen 15252 ditandai secara tidak benar sebagai “UTF-8”: tidak valid paruh waktu teratas (0xa3) pada posisi 36

Masalahnya ditemukan pada garis 15252: Garis [[1] "Siapa pun yang dapat memuaskan komandan penampilannya yang indah dan yang dapat memuaskan kendalinya."Teks ini cenderung dikodekan dalam Latin-1 alih-alih UTF-8 (atau ASCII) seperti yang dipertimbangkan. Anda dapat menguji ini dengan mencoba mengonversi dari Latin-1 ke UTF-8 dengan fungsi ICONV () dan memeriksa output:, "UTF-8") ICONV15252]
(Jalan,

“Latin” “

f "UTF-8"::Line2 [([1] "Siapa pun yang bisa puas dengan kecantikannya dan £ 20. 000." BENAR, Coops"UTF-8"::Drop_punct = Coops::Term_statsCoops
 Stopword)

The readtext package

Coops

Summary

Term_stats