iconv
位於 base
包(package)。 說明
這使用係統工具在編碼之間轉換字符向量:‘i’ 代表‘internationalization’。
用法
iconv(x, from = "", to = "", sub = NA, mark = TRUE, toRaw = FALSE)
iconvlist()
參數
x |
字符向量,或由 |
from |
說明當前編碼的字符串。 |
to |
說明目標編碼的字符串。 |
sub |
字符串。如果不是 |
mark |
合乎邏輯,供專家使用。應該標記編碼嗎? |
toRaw |
合乎邏輯的。是否應該返回原始向量列表而不是字符向量? |
細節
編碼的名稱以及可用的編碼取決於平台。全部R平台支持""
(用於當前語言環境的編碼),"latin1"
和"UTF-8"
。通常指定編碼時會忽略大小寫。
在大多數平台上iconvlist
提供支持的編碼的字母順序列表。在其他情況下,信息位於手冊頁上iconv(5)
或手冊頁中的其他地方(但要注意係統命令iconv
可能不支持與 C 函數相同的編碼集R調用)。不幸的是,這些名稱很少在所有平台上都得到支持。
除非指定 sub
,否則無法轉換的 x
元素(可能是因為它們無效或無法在目標編碼中表示)將返回為 NA
。
大多數版本iconv
將允許通過附加‘進行音譯//傳輸’到to
編碼:參見示例。
編碼"ASCII"
被接受,並且在大多數係統上"C"
和"POSIX"
是ASCII 的同義詞。如果操作係統不支持 "ASCII/TRANSLIT"
,則 "ASCII"
如果來自 UTF-8,則與 sub = "c99"
一起使用,否則 sub =
"?"
。 (但是,musl 的 "ASCII"
版本替代了 *
。)
對於 from = ""
,具有聲明的編碼(UTF-8 或 latin1,請參閱 Encoding
)的 x
元素將從該編碼轉換而來。
請注意, iconv
的實現通常不會進行太多有效性檢查,並且通常會 mis-convert 輸入在編碼 from
時無效。
如果 sub = "Unicode"
或 sub = "c99"
用於非 UTF-8 輸入,則與 sub = "byte"
相同。
值
如果toRaw = FALSE
(默認值),則該值是與x
(轉換為字符向量後)具有相同長度和相同屬性的字符向量。如果某個元素的轉換失敗,則結果的元素將設置為 NA_character_
。
如果 mark = TRUE
(默認)如果 to
是 "latin1"
或 "UTF-8"
,或者如果 to = ""
且當前區域設置的編碼被檢測為 Latin-1 (或其超集),則結果的元素具有聲明的編碼Windows 上的 CP1252)或 UTF-8。
如果是 toRaw = TRUE
,則該值是與 x
具有相同長度和相同屬性的列表,其元素是 NULL
(如果轉換失敗)或原始向量。
對於 iconvlist()
,已知編碼名稱的字符向量(通常包含數百個元素)。
實施細節
主要有以下三個實現iconv
正在使用。 Linux 最常見的 C 運行時,‘glibc’,包含一個。多個平台提供 GNU ‘libiconv”,包括 macOS 和 FreeBSD,在某些情況下還需要額外的編碼。在 Windows 上,我們使用 Yukihiro Nakadaira 的一個版本win_iconv’,它基於 Windows 的代碼頁。 (為了與其他係統兼容,我們添加了許多編碼名稱。)這三個都有iconvlist
,忽略編碼名稱中的大小寫並支持‘//傳輸’(但結果不同,並且對於‘win_iconv” 目前使用“最適合”策略,除了to = "ASCII"
)。
大多數商業 Unix 都包含一個實現iconv
但我們遇到的沒有一個支持我們需要的編碼名稱:“R安裝和管理”手冊建議安裝GNU“libiconv例如,在 Solaris 和 AIX 上。
一些 Linux 發行版使用‘穆斯林’作為他們的 C 運行時。這不如‘glibc':不支持'//傳輸’但轉換不精確(當前使用‘*’)。
還有其他實現,例如NetBSD 使用了 Citrus 項目中的一個(不支持‘//傳輸’)並且有一個較舊的 FreeBSD 端口(‘libiconv’通常在那裏使用):尚未報道這些是否與R.
請注意,您不能依賴於檢測到無效輸入,特別是對於to = "ASCII"
,其中某些實現允許 8 位字符並通過不變或音譯或替換來傳遞它們。
一些實現有有趣的額外編碼:例如 GNU ‘libiconv’允許to = "C99"
使用‘\uxxxx’ 轉義(或者如果需要的話‘\Uuxxxxxxxxxx’) 對於非 ASCII 字符。
字節順序標記
最常被稱為“BOM”。
使用大小超過 1 個字節的字符單元的編碼可以按大端或小端順序寫入文件:這最常適用於 UCS-2、UTF-16 和 UTF-32/UCS-4 編碼。某些係統會以這些編碼方式(或許也可能以 UTF-8 方式)在文件開頭寫入 Unicode 字符 U+FEFF
。在這種用法中,字符被稱為 BOM,並且應該在輸入期間進行處理(請參閱 connection
下的“編碼”部分:重新編碼的連接對 BOM 有一些特殊處理)。如果尚未執行此操作,則本節的其餘部分適用,因此 x
以 BOM 開頭。
實現通常會將 from
的 BOM 解釋為 "UCS-2"
、 "UTF-16"
和 "UTF-32"
之一。實現的不同之處在於如何處理其他 from
編碼中的 x
中的 BOM:它們可能會被丟棄、作為字符 U+FEFF
返回或被視為無效。
注意
ISO 8859-15 編碼的唯一合理可移植的名稱(通常稱為“Latin 9”)是"latin-9"
: 部分平台支持"latin9"
但 GNU 'libiconv' 才不是。
編碼名稱 "utf8"
、 "mac"
和 "macroman"
不可移植。對於 from
和 to
,"utf8"
由 iconv
轉換為 "UTF-8"
,但不適用於例如fileEncoding
參數。 "macintosh"
是“Mac Roman”( https://en.wikipedia.org/wiki/Mac_OS_Roman ) 的官方(也是最廣泛支持的)名稱。
使用 sub
替換輸入中的每個不可轉換字節,因此從 UTF-8 轉換時,不可轉換字符可能會被兩個或更多字節替換。使用sub = "c99"
或sub = "Unicode"
會更清晰。
例子
## In principle, as not all systems have iconvlist
try(utils::head(iconvlist(), n = 50))
## Not run:
## convert from Latin-2 to UTF-8: two of the glibc iconv variants.
iconv(x, "ISO_8859-2", "UTF-8")
iconv(x, "LATIN2", "UTF-8")
## End(Not run)
## Both x below are in latin1 and will only display correctly in a
## locale that can represent and display latin1.
x <- "fran\xE7ais"
Encoding(x) <- "latin1"
x
charToRaw(xx <- iconv(x, "latin1", "UTF-8"))
xx
iconv(x, "latin1", "ASCII") # NA
iconv(x, "latin1", "ASCII", "?") # "fran?ais"
iconv(x, "latin1", "ASCII", "") # "franais"
iconv(x, "latin1", "ASCII", "byte") # "fran<e7>ais"
iconv(xx, "UTF-8", "ASCII", "Unicode")# "fran<U+00E7>ais"
iconv(xx, "UTF-8", "ASCII", "c99") # "fran\u00e7ais"
## Extracts from old R help files (they are nowadays in UTF-8)
x <- c("Ekstr\xf8m", "J\xf6reskog", "bi\xdfchen Z\xfcrcher")
Encoding(x) <- "latin1"
x
try(iconv(x, "latin1", "ASCII//TRANSLIT")) # platform-dependent
iconv(x, "latin1", "ASCII", sub = "byte")
## and for Windows' 'Unicode'
str(xx <- iconv(x, "latin1", "UTF-16LE", toRaw = TRUE))
iconv(xx, "UTF-16LE", "UTF-8")
也可以看看
相關用法
- R icuSetCollate 按 ICU 設置整理
- R invisible 將打印模式更改為不可見
- R identity 恒等函數
- R is.recursive 對象是原子的還是遞歸的?
- R identical 測試對象是否完全相等
- R is.object 對象是“內部分類的”嗎?
- R integer 整數向量
- R isS4 測試 S4 對象
- R interactive R 是否以交互方式運行?
- R is.language 對象是語言對象嗎?
- R interaction 計算因子交互作用
- R isSymmetric 測試矩陣或其他對象是否對稱(厄米特)
- R is.finite 有限、無限和 NaN 數
- R is.single 對象是單精度類型嗎?
- R is.R 我們使用的是 R,而不是 S?
- R is.unsorted 測試對象是否未排序
- R ifelse 條件元素選擇
- R is.function 是類型(原始)函數的對象嗎?
- R file.path 構造文件路徑
- R grep 模式匹配和替換
- R getwd 獲取或設置工作目錄
- R vector 向量 - 創建、強製等
- R lapply 對列表或向量應用函數
- R dump R 對象的文本表示
- R Sys.getenv 獲取環境變量
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Convert Character Vector between Encodings。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。