首页 \ 问答 \ RStudio:在脚本中保留特殊字符(RStudio: keeping special characters in a script)

RStudio:在脚本中保留特殊字符(RStudio: keeping special characters in a script)

我写了一个德文特殊字符的脚本,例如ü 。 但是,每当我关闭R并重新打开脚本时,都会替换字符:

"für"; "hinzufügen"; "Ø" 之前 "für"; "hinzufügen"; "Ø" "für"; "hinzufügen"; "Ø" "für"; "hinzufügen"; "Ø" - "für"; "hinzufügen"; "Ã" "für"; "hinzufügen"; "Ã" "für"; "hinzufügen"; "Ã"

我尝试使用save with encoding和选择UTF-8来补救它save with encoding因为它在这里陈述但它不起作用。

我错过了什么?


I wrote a script with German special characters e.g. ü. However, whenever I close R and reopen the script the characters are substituted:

Before "für"; "hinzufügen"; "Ø" - After "für"; "hinzufügen"; "Ã".

I tried to remedy it using save with encoding and choosing UTF-8 as it is stated here but it did not work.

What am I missing?


原文:https://stackoverflow.com/questions/49296225
更新时间:2022-05-23 21:05

最满意答案

你没有说你使用的是什么操作系统,但是这种事情现在只发生在Windows上,所以我会假设这一点。

问题是Windows有一个不是UTF-8的本地编码。 在英语国家,它通常与Latin1类似。 我不确定在讲德语的国家/地区使用的是什么编码,如果那是你的位置。 从你看到的垃圾中,看起来好像你用UTF-8保存了文件,然后用你的本地编码读取它。 如果你想让事情发挥作用,那么写作和阅读的编码就必须匹配。

在RStudio中,您可以尝试“使用编码重新打开...”并指定UTF-8,并且只要在错误读取之后没有保存它,您可能会得到原始的原件。 如果你这样做了,你的清理工作就会更加困难。


You don't say what OS you're using, but this kind of thing really only happens on Windows nowadays, so I'll assume that.

The problem is that Windows has a local encoding that is not UTF-8. It is commonly something like Latin1 in English-speaking countries. I'm not sure what encoding people use in German-speaking countries, if that's where you are. From the junk you saw, it looks as though you saved the file in UTF-8, then read it using your local encoding. The encodings for writing and reading have to match if you want things to work.

In RStudio you can try "Reopen with encoding..." and specify UTF-8, and you'll probably get your original back, as long as you haven't saved it after the bad read. If you did that, you've got a much harder cleanup to do.

相关问答

更多
  • 在角色组中添加一个点。 /[^\p{LN}\-.]/u <-- see the dot Add a dot to your character group. /[^\p{LN}\-.]/u <-- see the dot
  • 你没有说你使用的是什么操作系统,但是这种事情现在只发生在Windows上,所以我会假设这一点。 问题是Windows有一个不是UTF-8的本地编码。 在英语国家,它通常与Latin1类似。 我不确定在讲德语的国家/地区使用的是什么编码,如果那是你的位置。 从你看到的垃圾中,看起来好像你用UTF-8保存了文件,然后用你的本地编码读取它。 如果你想让事情发挥作用,那么写作和阅读的编码就必须匹配。 在RStudio中,您可以尝试“使用编码重新打开...”并指定UTF-8,并且只要在错误读取之后没有保存它,您可能会 ...
  • 将我的评论转换为答案,因为我认为它会解决您的问题: 确保您的脚本以UTF-8编码。 其他一切都是疯狂的。 1 不使用从根本上不起作用的source ,而是使用 eval(parse('your/file.r', encoding = 'UTF-8')) 这可以替代source 。 正如链接的答案所解释的那样,原因是source尝试(并且失败)转换UTF-8编码的字符,而parse不执行任何转换; 相反,它从文件中逐字加载字符串,并简单地将其标记为UTF-8编码。 不幸的是,您必须手动执行此操作,假设RSt ...
  • LOAD DATA INFILE还支持FIELDS ESCAPED BY子句,它允许您指定MySQL使用哪个字符来识别字符串中的特殊字符,例如单引号字符串中的单引号或制表符(就像您在FIELDS TERMINATED BY子句,表示为\t )。 FIELDS ESCAPED BY子句的默认值是\ ,一个反斜杠,这就是为什么你的路径字符被MySQL解释然后被忽略的原因; 转义非特殊字符只会返回该字符,因此\1只返回1 。 但是,您会遇到文件名问题,例如c:\tmp\newfile因为\t和\n都被解释为特殊字 ...
  • 谢谢安德鲁 ,我解决了这个问题。 问题是标准分析器用于索引,而不是my_analyzer 。 因此,我忘了使用映射。 正确的版本: data = { "settings": { "analysis": { "analyzer": { "my_analyzer": { "type": "custom", "filter": [ "lowercase" ...
  • 如果您已经保存了该文件,并且丢失了该文件的原始版本,恢复过程将非常痛苦。 当你注意到坏字符是“重新打开编码”,并选择“UTF-8”编码时,应该做的事情。 如果您仍然可以获取原始文件,请立即执行此操作。 如果你不能,那么你会陷入大量的手动修复。 重音字符(和欧元符号以及其他一些东西)将显示为多字符序列。 当您识别一个字符时,使用搜索和替换来替换具有正确字符的序列。 If you have already saved it and you've lost the original version of the ...
  • 问题是你正在做的事情: set x = [some string with shell globbing characters] 这不会与set x = foo工作的原因相同,但是set x = [foo]则不行。 你需要使用set x = "[foo]" (或'[foo]' )来转义特殊的shell globbing字符(在这种情况下是[和] )。 在C shell中嵌套引号非常困难, 这也是一般不鼓励使用C shell进行脚本编写的原因之一。 这可能是你的命令,但我不够聪明(或太懒)弄清楚如何。 我的 ...
  • 我认为你坚持正则表达式。 正则表达式是您的要求是/^[a-z0-9_ .-]*$/i var myField = new LiveValidation('myField', { validMessage: "I am valid!" }); myField.add(Validate.Format, { pattern: /^[a-z0-9_ .-]*$/i }); I think you are stuck with regular expression. The regular expression i ...
  • 目前还不清楚else if你的代码中else if一部分代码是你正在尝试使用的。 readline()的本质是它将返回用户输入的字符串。 输入中是否包含任何不想包含的特定字符? 您可以使用grepl()来标识它们并防止用户将它们作为输入输入。 如果您试图确保用户输入了某些内容,则应按照注释中的建议使用while循环。 如果要在函数运行后在R中使用变量,则需要return() v1的值 - 用户输入。 如果您试图用%20替换名字和姓氏之间的空格,那么您可能需要使用gsub() 。 请参阅下面的代码。 fun1 ...
  • 试试getpass模块: >>> import getpass >>> getpass.getpass # the getpass function >>> getpass.getpass('Enter password: ') # call it with a prompt Enter password: 'this is a password' 它将隐藏正在键入的字符。 Try the getpass modul ...