RP系列 | 字符編碼:RP Photonics軟件的有用概述和新功能

在這里您可以對(duì)計(jì)算機(jī)內(nèi)存和文件中的字符編碼問題進(jìn)行非常有用的介紹。此外,本文還討論了 RP Photonics 的軟件如何實(shí)現(xiàn)現(xiàn)代化,從而可以在幾乎所有情況下避免編碼問題。

大概每一個(gè)計(jì)算機(jī)用戶遇到有關(guān)字符編碼問題-例如,特殊字符(例如:μ 2,°)從文本文件中讀取數(shù)據(jù)時(shí)被損壞。如果您正確地理解了這個(gè)問題,那么這些問題至少會(huì)減少一些麻煩,但是很少有人這樣做。事情可能會(huì)很復(fù)雜。
在本文中,我們?yōu)槟峁﹥杉拢合M杏玫?,?duì)技術(shù)背景有所簡(jiǎn)化的介紹,以及有關(guān)在我們的軟件中實(shí)現(xiàn)的字符編碼處理的深刻改進(jìn)的說明。
許多用戶可能只是不使用任何特殊字符,從而避免了任何編碼問題。但是,您可能會(huì)得到一些特殊的輸出,尤其是希臘語 μ 用作格式化數(shù)字輸出中的微符號(hào)。在某些國(guó)家/地區(qū),您甚至可能想要使用更多的東西,特別是在創(chuàng)建 自定義表格時(shí) ,例如包含中文或日語的說明或一些箱形圖符號(hào)。

字符編碼的一般說明

計(jì)算機(jī)內(nèi)存和文件不存儲(chǔ)數(shù)字或字符本身,而僅存儲(chǔ)位序列。根據(jù)某些編碼,這些字符通常被解釋為數(shù)字或字符。無論是數(shù)字還是字符,目前都存在非常不同種類的編碼。

編碼與字體

人們不應(yīng)混淆字符編碼和字體的問題; 如今,這些方面通常是單獨(dú)處理的。編碼確定哪種字符(例如,某個(gè)字母)與某個(gè)位序列相關(guān)聯(lián),而字體則確定該字符在屏幕上顯示或打印時(shí)的外觀。通過使用不同的字體,例如,一個(gè)字母“ A”可以具有不同的圖形外觀。

ASCI編碼

對(duì)于字符,早期使用 ASCII 編碼,僅提供128個(gè)可用的不同字符,以單個(gè)字節(jié)(一組8位)表示,其中僅使用低7位。當(dāng)然,這僅對(duì)于最簡(jiǎn)單的目的就足夠了。

ANSI代碼頁

由于需要更多不同的字符,因此人們很快開始使用擴(kuò)展的字符范圍,其中使用了可以用8位編碼的完整256個(gè)字符。但是,已經(jīng)使用了(但仍在使用)這種 ANSI 字符集的許多不同版本。其中一些主要包含重音字母(例如法語)之類的內(nèi)容,而其他一些包含其他語言的字母或更多特定類型的符號(hào)(例如,箱形圖符號(hào))。基本上,問題是這個(gè)世界上的整個(gè)人需要遠(yuǎn)遠(yuǎn)超過256個(gè)不同的字符。在 Windows 中,不同的 ANSI 字符集以所謂的代碼頁為特征(最初由 IBM 引入)。例如,在歐洲部分地區(qū),Windows系統(tǒng)通常使用代碼頁1252“西歐”。請(qǐng)注意,對(duì)于像日本這樣需要256個(gè)以上字符的國(guó)家,8位不足以表示一個(gè)字符。
盡管使用不同的 ANSI 代碼頁可以使用各種各樣的字符,但是這種方法存在嚴(yán)重的局限性。特別地,例如以這種編碼顯示文本文件的內(nèi)容時(shí),這僅在相應(yīng)的代碼頁是已知的并且被正確考慮時(shí)才正確地起作用。不幸的是,純文本文件通常在使用的代碼頁上不包含任何信息,因此通常需要其他信息(例如,由用戶手動(dòng)發(fā)送)才能正確顯示此類文件;如果有此類信息,則可能正確也可能不正確。另外,除非文件只包含在兩個(gè)代碼頁中都出現(xiàn)的字符,否則當(dāng)然不能將文件從一個(gè)代碼頁轉(zhuǎn)換為另一代碼頁而不會(huì)造成信息丟失。

Unicode作為通用解決方案

為了解決這些問題,已經(jīng)開發(fā)了 Unicode系統(tǒng)(即,與各種編碼系統(tǒng)結(jié)合的Unicode字符定義)。在這里,可以對(duì)大量不同的字符(每個(gè)字符用一個(gè)所謂的代碼點(diǎn)表示)進(jìn)行編碼-實(shí)際上是通常需要的任何字符。
當(dāng)然,一個(gè)字節(jié)(8位)不足以編碼任意 Unicode 字符。現(xiàn)在,有兩種不同的編碼方案可用于處理計(jì)算機(jī)內(nèi)存或文件中的 Unicode 字符。一種通用的方案是 UTF-16,其中一個(gè)字符通常使用16位(2字節(jié)),但是對(duì)于某些字符,實(shí)際上使用了其中的2個(gè),即總共32位,稱為代理對(duì)。該方案對(duì)于在 CPU 和主存儲(chǔ)器中使用非常實(shí)用。Unicode 字符的另一種常見編碼方案是 UTF-8,其中最常見的字符是用一個(gè)字節(jié)(8位)編碼的,其他大多數(shù)字符則需要兩個(gè)字節(jié),有些甚至需要三個(gè)或四個(gè)字節(jié)。
例如,只有在已知使用的編碼(例如 ANSI 或 Unicode,以及哪種特定方案)的情況下,才能正確處理計(jì)算機(jī)文件的內(nèi)容。不幸的是,該信息經(jīng)常由于錯(cuò)誤的編碼假設(shè)而丟失或損壞。通過在文件的開頭寫入一個(gè)由幾個(gè)字節(jié)組成的所謂的字節(jié)序標(biāo)記(BOM),已解決了許多 Unicode 文件的問題。在文本文件中找到這樣的 BOM 的程序可以使用它來確定(a)它是 Unicode 文件,以及(b)確切使用了哪種UTF編碼。但是,例如對(duì)于使用Unicode而不使用 Unicode 的網(wǎng)頁,這很常見。BOM;使用的編碼在其他地方(在頁面內(nèi)容之前發(fā)送的HTTP標(biāo)頭中)指示。這樣,軟件通常很難或不可能確定某個(gè)文件使用了哪種編碼。向用戶詢問可能是不切實(shí)際的,或者是行不通的,因?yàn)橛脩粢膊恢馈?/span>
當(dāng)然,對(duì)于一個(gè)字符不使用固定數(shù)目的字節(jié)的編碼意味著一些技術(shù)上的困難。例如,為了找到這樣一個(gè)字節(jié)序列中的第23個(gè)字符,必須從頭開始對(duì)其進(jìn)行掃描,以便正確考慮每個(gè)先前字符的字節(jié)數(shù)。由于這些困難,修改舊軟件以使其能夠處理 Unicode 數(shù)據(jù)通常并不容易。原則上可以通過使用 UTF-32 編碼解決此問題,其中每個(gè)字符都由32位(4字節(jié))表示,但是很少使用,因?yàn)樗惶峁┯糜诖鎯?chǔ)文本的內(nèi)存有效方式。

我們軟件中的編碼處理

在 RP Photonics 的軟件的早期版本(2017年之前)中,整個(gè)內(nèi)部都使用UTF-16形式的Unicode,但是文本文件(例如腳本)是根據(jù) Windows 系統(tǒng)的標(biāo)準(zhǔn)代碼頁以ANSI編碼編寫的。這種方法很普遍,但是卻給日本用戶帶來了麻煩。另外,還存在(罕見)問題,例如希臘語的 μ(微)字符丟失或在某些代碼頁中的編碼方式不同。因此,現(xiàn)在工作已進(jìn)行了深刻的現(xiàn)代化,得出以下規(guī)則:
  • 內(nèi)部使用 UTF-16,幾乎可以處理所有字符。只是它并不關(guān)心某些位置的代理對(duì)。可能會(huì)導(dǎo)致問題,但是我們軟件的幾乎所有用戶都不會(huì)處理這樣的字符,即使那樣,它也經(jīng)??梢怨ぷ鳌?/span>

  • 現(xiàn)在,當(dāng)軟件編寫純文本文件時(shí)(例如,當(dāng)用戶保存腳本或交互式表單的設(shè)置時(shí)),它始終將 BOM 表使用 UTF-8 編碼(請(qǐng)參見上文)。這意味著(a)現(xiàn)在幾乎所有字符都可以存儲(chǔ)在文件中,并且(b)毫無疑問可以自動(dòng)確定對(duì)該文件使用了哪種編碼。

  • 該軟件提供了將信息保存在文本文件中的各種功能; 例如,請(qǐng)參見描述函數(shù)open_file()的頁面。默認(rèn)情況下,它現(xiàn)在也對(duì)此類文件使用 UTF-8,但是上述功能提供了一項(xiàng)新功能,即可以更改用于寫入或在讀取文本文件時(shí)使用的文件編碼。因此,現(xiàn)在可以輕松編寫或讀取具有任何編碼的文本文件-不管是帶或不帶BOM 的 Unicode。

  • 現(xiàn)在,所有演示腳本和相關(guān)文件都使用 UTF-8(帶有BOM)進(jìn)行編碼。

  • 當(dāng)讀取不帶 BOM 的純文本文件,并且未明確告知軟件編碼是什么時(shí),它將采用帶有特定代碼頁的 ANSI 編碼。默認(rèn)情況下,該代碼頁為1252(西歐),這會(huì)導(dǎo)致正確的結(jié)果,例如,加載舊版本的演示腳本時(shí)。但是,如果在 Windows 系統(tǒng)中具有不同代碼頁的用戶使用較舊版本的軟件保存了文件,則此假設(shè)可能會(huì)導(dǎo)致問題。因此,可以在常規(guī)設(shè)置中更改假定的代碼頁(請(qǐng)參閱“選項(xiàng)” |“選項(xiàng)”);在打開這樣的文件之前,需要在此處設(shè)置正確的代碼頁。此后,可以保存文件以便以 UTF-8 編碼獲取文件。因此,即使在這種罕見的情況下,您也不需要額外的軟件使用程序來轉(zhuǎn)換舊文件。

  • 剩下的問題是如何在軟件中輸入特殊字符。在主菜單中,可以使用“編輯” |“輸入”來獲得一個(gè)新的字符映射表。角色圖。例如,您可以在此處選擇某個(gè)字符塊并單擊任何顯示的字符,以收集它們并將其粘貼到腳本中。無論如何,您可以將任何文本粘貼到腳本編輯器中,因此您可以使用一些外部使用程序來輸入特殊字符。

采用的方法意味著您現(xiàn)在可以使用所有類型的 Unicode 字符,即使在單個(gè)腳本或輸出文件中也可以使用,并且以后讀取此類文件時(shí),它們也不會(huì)損壞。從現(xiàn)在開始寫入的文本文件的編碼將始終被正確識(shí)別,因此您不會(huì)遇到損壞的特殊字符的問題。因此,通常您無需關(guān)心,它就可以正常工作。并且要格外小心(請(qǐng)參閱上文),您可以正確加載舊文件(即使是包含特殊字符的文件),并使用 UTF-8 編碼再次保存。
也可以一次打開大量文本文件,即使用單個(gè) File | File。公開行動(dòng)。這對(duì)于轉(zhuǎn)換一堆文件很有用:只需打開所有文件,然后使用 Ctrl-S 保存每個(gè)文件即可。
登錄后免費(fèi)查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項(xiàng)目客服
  • 培訓(xùn)客服
  • 平臺(tái)客服

TOP

3
2