删除R/C中的字节顺序标记

删除R/C中的字节顺序标记,c,json,r,utf-8,C,Json,R,Utf 8,有一个服务器示例,该服务器使用。RFC7159表示: 实现不能在JSON文本的开头添加字节顺序标记。为了实现互操作性,解析JSON文本的实现可能会忽略字节顺序标记的存在,而不是将其视为错误 当前,因此在BOM上阻塞。我希望遵循RFC建议,忽略UTF8字符串中的BOM(如果存在)。做这件事的有效方法是什么?天真的实现: if(substr(json, 1, 1) == "\uFEFF"){ json <- substring(json, 2) } if(substr(json,1,1)

有一个服务器示例,该服务器使用。RFC7159表示:

实现不能在JSON文本的开头添加字节顺序标记。为了实现互操作性,解析JSON文本的实现可能会忽略字节顺序标记的存在,而不是将其视为错误

当前,因此在BOM上阻塞。我希望遵循RFC建议,忽略UTF8字符串中的BOM(如果存在)。做这件事的有效方法是什么?天真的实现:

if(substr(json, 1, 1) == "\uFEFF"){
  json <- substring(json, 2)
}
if(substr(json,1,1)=“\uFEFF”){
json一个简单的解决方案:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
std::string stripBom(std::string x) {
   if (x.size() < 3)
      return x;

   if (x[0] == '\xEF' && x[1] == '\xBB' && x[2] == '\xBF')
      return x.substr(3);

   return x;
}

/*** R
x <- "\uFEFFabcdef"
print(x)
print(stripBom(x))
identical(x, stripBom(x))
utf8ToInt(x)
utf8ToInt(stripBom(x))
*/
#包括
使用名称空间Rcpp;
//[[Rcpp::导出]]
std::string stripBom(std::string x){
如果(x.size()<3)
返回x;
如果(x[0]='\xEF'&&x[1]='\xBB'&&x[2]='\xBF')
返回x.r(3);
返回x;
}
/***R
x打印(x)
[1] “abcdef”
>打印(条带BOM(x))
[1] “abcdef”
>相同(x,条带BOM(x))
[1] 假的
>utf8ToInt(x)
[1] 65279    97    98    99   100   101   102
>utf8ToInt(条带BOM(x))
[1]  97  98  99 100 101 102
编辑:还有一点可能很有用,那就是看看R在内部是如何工作的——在很多情况下,R会剥离BOM(例如扫描仪和文件读取器)。请参阅:


基于Kevin的Rcpp示例,我使用以下C函数检查bom:

SEXP R_parse(SEXP x) {
  /* get data from R */
  const char* json = translateCharUTF8(asChar(x));

  /* ignore BOM as suggested by RFC */
  if(json[0] == '\xEF' && json[1] == '\xBB' && json[2] == '\xBF'){
    warning("JSON string contains UTF8 byte-order-mark!");
    json = json + 3;
  }

  /* parse json */
  char errbuf[1024];
  yajl_val node = yajl_tree_parse(json, errbuf, sizeof(errbuf));
}

BOM的UTF-8表示将是EF-BB BF。这不解决任何一种语言中的问题。OP-标签。1)RCPP是R生态系统的一个非常重要的部分,并且有助于演示/原型化这些问题,并且2)将这一点从C++到C转换是微不足道的。Rcpp包,尽管
Rcpp::sourceCpp()
。也许你会很乐意添加C翻译?或者如果更好的话,我可能会为其中一个提供代码并进行编辑?@KevinUshey我添加了提交引用,因为
主干
链接将引用静态行号而不是代码…
扫描.C
看起来仍然正确,但
连接.C
定义自从发布这篇文章以来,我一直在移动,请快速检查以确认我选择了正确的更新线路,这些线路看起来对我来说是正确的。非常感谢您的查看!
SEXP R_parse(SEXP x) {
  /* get data from R */
  const char* json = translateCharUTF8(asChar(x));

  /* ignore BOM as suggested by RFC */
  if(json[0] == '\xEF' && json[1] == '\xBB' && json[2] == '\xBF'){
    warning("JSON string contains UTF8 byte-order-mark!");
    json = json + 3;
  }

  /* parse json */
  char errbuf[1024];
  yajl_val node = yajl_tree_parse(json, errbuf, sizeof(errbuf));
}