似乎有很多类似的问题和答案,但到目前为止还没有找到适合我的解决方案。
简而言之:当应用程序在 Linux Shiny 服务器上运行时,特殊字符(扫描字母、欧姆符号、摄氏度符号等)都会被打乱。Shiny Dashboard 上显示的数据是从 Oracle 数据库中查询的。这些示例中的列名称为“NAME”,类型为 VARCHAR2。当我在 R 中的 Linux 服务器或本地 Windows RStudio 上运行类似代码时,所有字符看起来都很好。
到目前为止我所尝试的:NLS_LANG=AMERICAN_AMERICA.AL32UTF8
将 NLS_LANG放入 /etc/environment后,Linux R 中的字符开始看起来不错。SELECT * FROM V$NLS_PARAMETERS
通过在 Linux 的 R 中运行和运行,我认为这些是正确的 NLS_LANG 设置SELECT * from NLS_SESSION_PARAMETERS
。尽管这并不能解决 Shiny Server 端的问题。
我也玩过 dbConnect 编码参数,但没有运气。
有点可重现的例子:(对不起,我无法访问我的 Oracle 服务器 ;-))
library(ROracle)
ORAdrv <- dbDriver("Oracle", unicode_as_utf8 = TRUE, ora.attributes = TRUE) #doesn't matter if I have these two latter attributes or not
ORAconnect.string <- paste(
"(DESCRIPTION=",
"(ADDRESS=(PROTOCOL=tcp)(HOST=xx.xx.xx.xx)(PORT=xxxx))",
"(CONNECT_DATA=(SID=...)))", sep = ""
)
query2 <- ("select NAME, DATA_FIELD from TABLE where DATA_FIELD in ('ID7018789', 'ID7025838', 'ID7021380')")
ORAcon <- dbConnect(ORAdrv, username = "...", password = "...", dbname = ORAconnect.string, encoding = "UTF-8") #doesn't matter if encoding is defined or not
res <- dbSendQuery(ORAcon, query2, 'set character set "utf8"') #doesn't matter if the last attribute is defined or not
df <- fetch(res)
dbDisconnect(ORAcon)
print(df)
最终结果是什么样子的:
如果我在 Linux R 中运行代码,结果是预期的(欧姆、摄氏度符号和扫描字符看起来不错):
如果我在 ShinyServer 应用程序上运行相同的代码并将数据帧呈现为数据表,结果如下:(欧姆和摄氏度符号被替换为问号,扫描字符 äö -> ao)
非常感谢您在 Shiny Server 应用程序端正确获取编码的任何帮助 =)