當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R iconv 在編碼之間轉換字符向量


R語言 iconv 位於 base 包(package)。

說明

這使用係統工具在編碼之間轉換字符向量:‘i’ 代表‘internationalization’。

用法

iconv(x, from = "", to = "", sub = NA, mark = TRUE, toRaw = FALSE)

iconvlist()

參數

x

字符向量,或由 as.character 轉換為字符向量的對象,或由 iconv(toRaw = TRUE) 返回的包含 NULLraw 元素的列表。

from

說明當前編碼的字符串。

to

說明目標編碼的字符串。

sub

字符串。如果不是 NA,則用於替換輸入中的任何不可轉換字節。 (這通常是單個字符,但也可以更多。)如果是 "byte" ,則指示為 "<xx>" 以及字節的十六進製代碼。如果 "Unicode" 並從 UTF-8 轉換,則 Unicode 點采用 "<U+xxxx>" 形式,或者如果 c99 ,則為 C99 樣式轉義 "\uxxxx"

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" 不可移植。對於 fromto"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")

也可以看看

localeToCharsetfile

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Convert Character Vector between Encodings。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。