当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。