2013-12-11 2 views
7

10001100Œ विस्तारित ASCII तालिका में लैटिन पूंजी लिगरेचर ओई है, मैं इसे यूटीएफ -8 एन्कोडिंग के साथ एक फ़ाइल में लिखना चाहता हूं।प्रिंट करने योग्य एएससीआई कैसे लिखना और पढ़ना है?

zz <- file("c:/testbin", "wb") 
writeBin("10001100",zz) 
close(zz) 

जब मैं कार्यालय के साथ फ़ाइल को खोलने (एन्कोडिंग = UTF-8), मैं Œ देख सकते हैं कि मैं क्या नहीं पढ़ सकते हैं readBin साथ है?

zz <- file("c:/testbin", "rb") 
readBin(zz,raw())->x 
x 
[1] c5 
readBin(zz,character())->x 
Warning message: 
In readBin(zz, character()) : 
incomplete string at end of file has been discarded 
x 
character(0) 
+1

मुझे 'charToRaw' से' 8c' मिलता है, क्या आप अपने प्रश्न में 'sessionInfo()' का आउटपुट डाल सकते हैं? – James

उत्तर

10

संभव है कि अनेक कठिनाइयों यहाँ हैं।

सबसे पहले, वास्तव में 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 के रूप में सहेजा था?

1

बजाय इस प्रयास करें (मैं UTF एन्कोडिंग के साथ बाइनरी मान प्रतिस्थापित क्योंकि मुझे लगता है कि जब आप इस तरह के एक उत्पादन चाहते हैं यह बेहतर है):

writeBin(charToRaw("\u0152"), zz) 
+0

क्यों charToRaw ("Œ") c5 92 है '8c' नहीं? –

+0

आपको '8c' कैसे मिला? :-) – rlegendi

+0

ascii तालिका में, आप इसे देख सकते हैं। –

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