Rcpp :: String сохраняет кодировку UTF-8, а std :: string - нет - PullRequest
6 голосов
/ 27 сентября 2019

Как мне взаимодействовать с кодом, который создает вектор строк с std::vector<std::string> и поддерживать кодировку UTF-8 так же, как Rcpp::String делает по умолчанию?

У меня есть std::vector<std::string> изСтроки UTF-8, которые я хочу иметь возможность возвращать в R. Rcpp wrap()s, как и ожидалось, возвращая символьный вектор, но, похоже, отбрасывает кодировку UTF-8 (в Windows).Я предполагаю, что это вызвано базовым поведением строки R, но если Rcpp::CharacterVector построен с использованием Rcpp::String s, поведение корректное.

Вот пример использования std::vector<std::string> ...

#include <Rcpp.h>

// [[Rcpp::export]]
std::vector<std::string> cpp_foo() {
  std::string let1("ف");
  std::string let2("خ");

  std::vector<std::string> out;
  out.push_back(let1);
  out.push_back(let2);

  return out;
}

, который искажает строки.

cpp_foo()
# [1] "Ù\u0081" "Ø®"

Вот пример желаемого поведения, используя Rcpp::String ...

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::CharacterVector rcpp_foo() {
  Rcpp::String let1("ف");
  Rcpp::String let2("خ");

  Rcpp::CharacterVector out;
  out.push_back(let1);
  out.push_back(let2);

  return out;
}

...сохраняет строки.

rcpp_foo()
# [1] "ف" "خ"
sessionInfo()
# R version 3.6.1 (2019-07-05)
# Platform: x86_64-w64-mingw32/x64 (64-bit)
# Running under: Windows 10 x64 (build 18362)
# 
# Matrix products: default
# 
# locale:
# [1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
# [3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
# [5] LC_TIME=English_United States.1252    
# 
# attached base packages:
#   [1] stats     graphics  grDevices utils     datasets  methods   base     
# 
# loaded via a namespace (and not attached):
#   [1] compiler_3.6.1 tools_3.6.1    Rcpp_1.0.2     packrat_0.5.0 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...