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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
