【问题标题】:How can I find out the internal code representation of a WINDOWS-1252 character?如何找出 WINDOWS-1252 字符的内部代码表示?
【发布时间】:2011-03-05 16:42:37
【问题描述】:

我正在处理来自 M$ Word 的调查问卷中的 SPSS 数据。 Word 自动将连字符变为长连字符,并转换为无法正常显示的字符,即“-”变为“ú”。

我的问题:WINDOWS-1252字符集中的utf8ToInt()等价物是什么?

utf8ToInt("A")
[1] 65

当我使用自己的数据执行此操作时,出现错误:

x <- str_sub(levels(sd$j1)[1], 7, 7)
print(x)
[1] "ú"

utf8ToInt(x)
Error in utf8ToInt(x) : invalid UTF-8 string

但是,x 的内容在 grep 和 gsub 表达式中完全可用。

> Sys.getlocale()
[1] "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252"

【问题讨论】:

  • 祝你好运尝试在 R for Windows 中使用 Unicode 文本做任何事情!
  • 你的问题是“ú”没有编码为UTF-8。它实际上是“\xfa”,并以 R 所称的 latin1 编码,但我想象的实际上是 1252。 Windows 有一种完全不同的处理 Unicode 文本的方式,我不相信 Windows 上的 R 会努力以 Windows 的方式来处理它。我向你表示同情,但我不能提供更多!
  • @David Hefferman,非常感谢您的洞察力和同情!不过,有没有办法确定这个 latin1 字符的内部表示,比如 latin1ToInt() - 我还没有找到。而且,反之亦然,如果我知道 Latin1 代码是 150,我如何生成实际字符,同样类似于 intToLatin1()?
  • @Andrie 非常抱歉,但我没有什么可提供的。我发现 R 文档帮助不大,我非常担心它是为使用字节流和语言环境的基于 UNIX 的系统开发的,并且没有考虑到基于 UTF-16 的 Windows Unicode。
  • @David 谢谢。我的代码现在可以使用,我真的不需要知道这些代码。为了在未来的项目中重用这项工作,一个笨拙的解决方法是创建非打印字符及其 ASCII 等效项的哈希表,然后为未来的项目创建 save() 和 load()。非常感谢您的帮助。

标签: r


【解决方案1】:

如果您通过read.spss表单包foreign加载SPSS sav文件,您可以通过指定编码轻松导入具有正确编码的数据帧:

read.spss("foo.sav", reencode="CP1252")

【讨论】:

  • 看到您的回复我非常兴奋,并立即在我的数据上进行了尝试。可悲的是,这没有达到预期的效果,我仍然得到无法正确显示的字符。我也遍历了整个 iconvlist() 但仍然没有运气。但感谢您提供非常有帮助的答案。
【解决方案2】:

经过一番摸索、大量阅读帮助文件和反复试验后,我创建了两个满足我需要的小函数。这些函数的工作原理是将其输入转换为 UTF-8,然后返回 UTF-8 编码字符向量的整数向量,反之亦然。

# Convert character to integer vector
# Optional encoding specifies encoding of x, defaults to current locale
encToInt <- function(x, encoding=localeToCharset()){
    utf8ToInt(iconv(x, encoding, "UTF-8"))
}

# Convert integer vector to character vector
# Optional encoding specifies encoding of x, defaults to current locale
intToEnc <- function(x, encoding=localeToCharset()){
    iconv(intToUtf8(x), "utf-8",  encoding)
}

一些例子:

x <- "\xfa"
encToInt(x)
[1] 250

intToEnc(250)
[1] "ú"

【讨论】:

  • 恭喜。看起来是一份不错的工作。现在我已经习惯了简单的无语言环境的 Windows UTF-16 处理 Unicode,我发现 R 语言环境中的所有跳跃都有些乏味。我想我的 cmets 说的很清楚!
【解决方案3】:

我使用了 Andrie 代码的变体:

  • x 上矢量化,以便我可以将其应用于矢量/字符列
  • 通过简单地返回最后一个编码整数来处理由两个 utf8 字符编码的字符(如“\u0098”,它给出 c(194, 152))。

这在例如将 latin1/cp1252 字符映射到整数范围时很有用,这是我的应用程序(他们说“更紧凑的文件格式”)。如果您需要在某个时候将整数转换回字符,这显然是不合适的。

encToInt <- Vectorize(
  function(x, encoding){
    out <- utf8ToInt(iconv(x, encoding, "UTF-8"))
    out[length(out)]
  },
  vectorize.args="x", USE.NAMES = F, SIMPLIFY=T)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2012-09-08
    • 1970-01-01
    • 2012-07-16
    相关资源
    最近更新 更多