2016-07-07 8 views
6

मैंने पाया है कि यूनिकोड तारों को कैसे लिखना है, लेकिन यह अभी भी परेशान है कि यह क्यों काम करता है।आर विंडोज में टेक्स्ट फ़ाइल में यूनिकोड स्ट्रिंग कैसे लिखें?

str <- "ỏ" 
Encoding(str) # UTF-8 
cat(str, file="no-iconv") # Written wrongly as <U+1ECF> 
cat(iconv(str, to="UTF-8"), file="yes-iconv") # Written correctly as ỏ 

मुझे समझ में क्यों no-iconv दृष्टिकोण काम नहीं करता। ऐसा इसलिए है क्योंकि cat (और writeLines भी) convert the string into the native encoding first and then to the to= encoding। विंडोज़ पर, इसका मतलब है कि आर को Windows-1252 में परिवर्तित करता है, जो को समझ नहीं सकता है, जिसके परिणामस्वरूप <U+1ECF> हो सकता है।

क्या मुझे समझ नहीं आता क्यों yes-iconv दृष्टिकोण काम करता है। अगर मैं सही ढंग से समझता हूं, तो iconv क्या UTF-8 एन्कोडिंग के साथ एक स्ट्रिंग को वापस करने के लिए है। लेकिन str पहले से ही UTF-8 में है! iconv क्यों कोई फर्क पड़ता है? इसके अलावा, जब iconv(str, to="UTF-8") पहले Windows-1252 को परिवर्तित करके cat गड़बड़ सब कुछ एक बार फिर से cat को पारित कर दिया, चाहिए नहीं है?

+0

मैं नहीं पता है या आर अपने आप उपयोग करते हैं, लेकिन सिर्फ प्रलेखन, 'बिल्ली()' आउटपुट चरित्र तार "जैसा है", और '' iconv() की mark' पैरामीटर पढ़ने 'डिफ़ॉल्ट रूप से सही है, तो 'iconv (str, to =" UTF-8 ") को कॉल करना' 'बिल्ली()' को पारित होने से पहले यूटीएफ -8 के रूप में स्पष्ट रूप से इसके आउटपुट को चिह्नित करता है। हो सकता है कि 'str <- "ỏ" '' str' को उसी तरह चिह्नित नहीं कर रहा है? 'Iconv()' के बिना यूटीएफ -8 के रूप में 'str' को स्पष्ट रूप से रूपांतरित और चिह्नित करने के लिए आप' enc2utf8 (str) 'या' एन्कोडिंग (str) <- "UTF-8" 'का उपयोग कर सकते हैं। शायद यह 'बिल्ली() 'में अंतर डाल रहा है। –

उत्तर

2

मुझे लगता है कि 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) में बराबर रूपांतरण।

संबंधित मुद्दे