मुझे लगता है कि cat()
उपयोग करने से पहले "unknown"
के एन्कोडिंग (की एक प्रति) str
की स्थापना कम जादू है और बस के रूप में अच्छी तरह से काम करता है। मुझे लगता है कि cat()
में किसी भी अवांछित चरित्र सेट रूपांतरणों से बचना चाहिए।
यहाँ एक विस्तारित उदाहरण प्रदर्शित करने के लिए मैं क्या सोचता मूल उदाहरण में होता है:
print_info <- function(x) {
print(x)
print(Encoding(x))
str(x)
print(charToRaw(x))
}
cat("(1) Original string (UTF-8)\n")
str <- "\xe1\xbb\x8f"
Encoding(str) <- "UTF-8"
print_info(str)
cat(str, file="no-iconv")
cat("\n(2) Conversion to UTF-8, wrong input encoding (latin1)\n")
## from = "" is conversion from current locale, forcing "latin1" here
str2 <- iconv(str, from="latin1", to="UTF-8")
print_info(str2)
cat(str2, file="yes-iconv")
cat("\n(3) Converting (2) explicitly to latin1\n")
str3 <- iconv(str2, from="UTF-8", to="latin1")
print_info(str3)
cat(str3, file="latin")
cat("\n(4) Setting encoding of (1) to \"unknown\"\n")
str4 <- str
Encoding(str4) <- "unknown"
print_info(str4)
cat(str4, file="unknown")
एक "Latin-1"
स्थान में (?l10n_info
देखें) के रूप में विंडोज पर आर द्वारा इस्तेमाल किया, उत्पादन फ़ाइलों "yes-iconv"
, "latin"
और "unknown"
चाहिए सही हो (बाइट अनुक्रम 0xe1
, 0xbb
, 0x8f
जो "ỏ"
है)।
"UTF-8"
लोकेल में, "no-iconv"
और "unknown"
फ़ाइलें सही होनी चाहिए।
उदाहरण कोड के उत्पादन, के रूप में इस प्रकार आर 3.3.2 64-बिट Windows संस्करण का उपयोग कर शराब पर चल रहा है:
(1) Original string (UTF-8)
[1] "ỏ"
[1] "UTF-8"
chr "<U+1ECF>""| __truncated__
[1] e1 bb 8f
(2) Conversion to UTF-8, wrong input encoding (latin1)
[1] "á»\u008f"
[1] "UTF-8"
chr "á»\u008f"
[1] c3 a1 c2 bb c2 8f
(3) Converting (2) explicitly to latin1
[1] "á»"
[1] "latin1"
chr "á»"
[1] e1 bb 8f
(4) Setting encoding of (1) to "unknown"
[1] "á»"
[1] "unknown"
chr "á»"
[1] e1 bb 8f
मूल उदाहरण में iconv()
डिफ़ॉल्ट from = ""
तर्क है जहाँ से आप रूपांतरण का मतलब का उपयोग करता है, वर्तमान लोकेल, जो प्रभावी रूप से "लैटिन 1" है। क्योंकि str
की एन्कोडिंग वास्तव में "UTF-8" है, स्ट्रिंग के बाइट प्रतिनिधित्व, कदम (2) में विकृत है, लेकिन फिर परोक्ष cat()
द्वारा बहाल जब यह (शायद) स्ट्रिंग वापस वर्तमान स्थान में धर्मान्तरित के रूप में द्वारा प्रदर्शन चरण (3) में बराबर रूपांतरण।
मैं नहीं पता है या आर अपने आप उपयोग करते हैं, लेकिन सिर्फ प्रलेखन, 'बिल्ली()' आउटपुट चरित्र तार "जैसा है", और '' iconv() की mark' पैरामीटर पढ़ने 'डिफ़ॉल्ट रूप से सही है, तो 'iconv (str, to =" UTF-8 ") को कॉल करना' 'बिल्ली()' को पारित होने से पहले यूटीएफ -8 के रूप में स्पष्ट रूप से इसके आउटपुट को चिह्नित करता है। हो सकता है कि 'str <- "ỏ" '' str' को उसी तरह चिह्नित नहीं कर रहा है? 'Iconv()' के बिना यूटीएफ -8 के रूप में 'str' को स्पष्ट रूप से रूपांतरित और चिह्नित करने के लिए आप' enc2utf8 (str) 'या' एन्कोडिंग (str) <- "UTF-8" 'का उपयोग कर सकते हैं। शायद यह 'बिल्ली() 'में अंतर डाल रहा है। –