संभव है कि अनेक कठिनाइयों यहाँ हैं।
सबसे पहले, वास्तव में several "Extended ASCII" tables हैं। चूंकि आप विंडोज़ पर हैं, इसलिए आप शायद CP1252 का उपयोग कर रहे हैं, जिनमें से एक है, जिसे Windows-1252
या ANSI
भी कहा जाता है, और विन डिफ़ॉल्ट "लैटिन" एन्कोडिंग। हालांकि टेबल के इस परिवार के भीतर the code for Œ
varies। जैसा कि आपने लिखा था CP1252
, "Œ"
10001100
या "\x8c"
द्वारा दर्शाया गया है। हालांकि यह does not exist in ISO-8859-1
है। और UTF-8
में यह "\xc5\x92"
या "\u0152"
के अनुरूप है, जैसा कि रेलेन्डेन्डी इंगित करता है।
तो, CP1252
-as-द्विआधारी के रूप में स्ट्रिंग से UTF-8
लिखने के लिए, आप इसे में एक "कच्चे" संख्या (बाइट्स के लिए R वर्ग) और फिर एक चरित्र अपने स्ट्रिंग परिवर्तित करने के लिए है, अपने "एन्कोडिंग" बदलने CP1252
से UTF-8
करने के लिए, (वास्तव में अपनी बाइट मूल्य इसी एक करने के लिए एक ही चरित्र के लिए UTF-8
में परिवर्तित) उसके बाद आप कर सकते हैं यह कच्चे करने के लिए फिर से परिवर्तित, और अंत में फ़ाइल पर लिखने:
char_bin_str <- '10001100'
char_u <- iconv(rawToChar(as.raw(strtoi(char_bin_str, base=2))),
# "\x8c" 8c 140 '10001100'
from="CP1252",
to="UTF-8")
test.file <- "~/test-unicode-bytes.txt"
zz <- file(test.file, 'wb')
writeBin(charToRaw(char_u), zz)
close(zz)
दूसरे, जब आप readBin()
, पढ़ने के लिए कई बाइट्स देना न भूलें जो कि काफी बड़ा है (n=file.info(test.file)$size
यहां), अन्यथा यह केवल पहला बाइट पढ़ता है (नीचे देखें):
zz <- file(test.file, 'rb')
x <- readBin(zz, 'raw', n=file.info(test.file)$size)
close(zz)
> x
[1] c5 92
तीसरा, अगर अंत में आप इसे एक चरित्र में बदलने के लिए वापस चाहते हैं, सही ढंग से समझा और आर द्वारा प्रदर्शित, तो आपको पहले की है यह एक स्ट्रिंग में परिवर्तित करने के rawToChar()
साथ। अब, जिस तरह से इसे प्रदर्शित किया जाएगा, वह आपके डिफ़ॉल्ट एन्कोडिंग पर निर्भर करता है, यह देखने के लिए Sys.getlocale()
देखें (शायद विंडोज़ पर 1252
के साथ समाप्त होने वाला कुछ)। संभवतः यह निर्दिष्ट करना है कि आपका चरित्र UTF-8
के रूप में पढ़ा जाना चाहिए - अन्यथा यह आपके डिफ़ॉल्ट एन्कोडिंग के साथ समझा जाएगा।
xx <- rawToChar(x)
Encoding(xx) <- "UTF-8"
> xx
[1] "Œ"
यह हर ओएस पर नियंत्रण में चीजें रखना चाहिए, UTF-8
में सही बाइट्स लिखते हैं, और हो सकता है एक ही। आशा करता हूँ की ये काम करेगा।
पुनश्च: मैं वास्तव में यकीन है कि क्यों अपने कोड में x
लौटे c5
नहीं कर रहा हूँ, और मैं इसे c5 92
वापस आ गए हैं यदि आप n=2
(या अधिक) एक पैरामीटर के रूप readBin()
को स्थापित किया था लगता है। मेरी मशीन पर (मैक ओएस एक्स 10.7, आर 3.0.2 और विन XP, आर 2।15) यह 31
लौटाता है, हेक्स ASCII '1'
का प्रतिनिधित्व करता है ('10001100'
में पहला char, जो समझ में आता है), आपके कोड के साथ। हो सकता है कि आपने अपनी फाइल को Office में CP1252
के रूप में खोला और आर पर वापस आने से पहले इसे UTF-8
के रूप में सहेजा था?
मुझे 'charToRaw' से' 8c' मिलता है, क्या आप अपने प्रश्न में 'sessionInfo()' का आउटपुट डाल सकते हैं? – James