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