2009-10-04 19 views
7

मैं Zemanta एपीआई का उपयोग कर रहा है, जो प्रति कॉल पाठ के 8 KB को स्वीकार करने के लिए पाठ काटना जावास्क्रिप्ट का उपयोग करना। मैं जावास्क्रिप्ट का उपयोग कर वेब पेजों से ज़ेमेन्टा को भेजने के लिए टेक्स्ट निकालने जा रहा हूं, इसलिए मैं एक ऐसे फ़ंक्शन की तलाश में हूं जो मेरे टेक्स्ट को ठीक से 8 केबी पर छोटा कर देगा।एक निश्चित आकार (8 KB)

ज़ेमेन्टा को अपने आप को इस छंटनी को करना चाहिए (यानी, यदि आप इसे एक बड़ी स्ट्रिंग भेजते हैं), लेकिन मुझे एपीआई कॉल करने से पहले इस पाठ को थोड़ा सा शटल करना होगा, इसलिए मैं पेलोड को छोटे के रूप में रखना चाहता हूं मुमकिन।

यह मान लेना कि पाठ के 8 KB 8,192 वर्ण है, और उसके अनुसार काट-छांट करने के लिए सुरक्षित है? (1 बाइट प्रति चरित्र; 1,024 वर्ण प्रति केबी; 8 केबी = 8,192 बाइट/वर्ण) या, क्या यह गलत या केवल कुछ निश्चित परिस्थितियों को सच है?

वहाँ अपने वास्तविक फ़ाइल आकार के आधार पर एक स्ट्रिंग को काटना एक और अधिक सुरुचिपूर्ण रास्ता नहीं है?

+0

आप जांच करना चाह सकते लेख है जिसे आप साथ काम कर रहे कुछ एन्कोडिंग, उदा की कर रहे हैं यूटीएफ -8, एएससीआईआई आदि? यदि आप निश्चित हैं कि पाठ में केवल एक-बाइट वर्ण हैं, तो कटाव अधिक सरल होगा। आप कुछ लचीलापन का व्यापार करेंगे। इस बात के लिए कि ज़ेमेन्टा 8 केबी 8192 बाइट्स या 8000 बाइट्स के रूप में व्यवहार करता है, तो आप इसका परीक्षण क्यों नहीं करते? –

+0

धन्यवाद, ओ.के.मुझे लगता है कि डोमिनिक सही है कि यह पाठ (संभवतः यूटीएफ -8) संभावित रूप से प्रति चरित्र एकाधिक बाइट्स ले जाएगा, इसलिए चरित्र-मात्रा के आधार पर मापना संभव नहीं होगा। – Bungle

उत्तर

9

आप एक सिंगल-बाइट एन्कोडिंग उपयोग कर रहे हैं, हाँ, 8192 वर्ण = 8192 बाइट्स। यदि आप यूटीएफ -16, 8192 वर्ण (*) = 40 9 6 बाइट्स का उपयोग कर रहे हैं।

(वास्तव में 8192 कोड-अंक है, जो किराए की कोख का सामना करने में एक अलग बात है, लेकिन उस के बारे में चिंता नहीं है क्योंकि जावास्क्रिप्ट नहीं करते हैं।)

आपको UTF-8 का उपयोग कर रहे हैं, तो वहाँ एक

function truncateByBytesUTF8(chars, n) { 
    var bytes= toBytesUTF8(chars).substring(0, n); 
    while (true) { 
     try { 
      return fromBytesUTF8(bytes); 
     } catch(e) {}; 
     bytes= bytes.substring(0, bytes.length-1); 
    } 
} 

(कोशिश ग के लिए कारण:

function toBytesUTF8(chars) { 
    return unescape(encodeURIComponent(chars)); 
} 
function fromBytesUTF8(bytes) { 
    return decodeURIComponent(escape(bytes)); 
} 

अब आप के साथ काट-छांट कर सकते हैं: त्वरित चाल आप कम से कम कोड के साथ जे एस में एक UTF-8 एनकोडर/विकोडक लागू करने के लिए उपयोग कर सकते हैं एटीएच वहाँ है कि यदि आप एक मल्टीबाइट वर्ण अनुक्रम के बीच में बाइट्स को छोटा करते हैं तो आपको एक अवैध यूटीएफ -8 स्ट्रीम और डिकोडुरिकॉम्पोनेंट शिकायत करेगा।)

यदि यह शिफ्ट-जेआईएस या बिग 5 जैसे अन्य मल्टीबाइट एन्कोडिंग है, आप अपने दम पर कर रहे हैं।

+1

यह वही है जो मैं खोज रहा था - एक आकर्षण की तरह काम करता है! धन्यवाद, बॉबन्स। वंशावली के लिए बस एक बहुत ही नोट - मैं थोड़ा घना हूं इसलिए मुझे यह महसूस करने में कुछ मिनट लगे कि आपके कार्यों में चर "यूनिकोडैरेक्टर" और "utf8bytes" केवल स्पष्टीकरण के लिए हैं, और वास्तव में काम करने के लिए तर्कों से मेल खाना चाहिए (यानी, दोनों को दो छोटे कार्यों में "एस" के साथ प्रतिस्थापित किया जाना चाहिए)। एक बार फिर धन्यवाद! – Bungle

+1

ओह! कट-एंड-पेस्ट के खतरे, वहां। पकड़ने के लिए ता! – bobince

2

नहीं यह मानना ​​सुरक्षित नहीं है कि 8KB पाठ 8192 वर्ण हैं, क्योंकि कुछ वर्ण एन्कोडिंग में, प्रत्येक वर्ण multiple bytes लेता है।

आप फ़ाइलों से डेटा पढ़ रहे हैं, तो आप सिर्फ फ़ाइल आकार आकर्षित नहीं कर सकते हैं? या इसे 8 केबी के टुकड़ों में पढ़ा?

+0

धन्यवाद, डोमिनिक - मैं जावास्क्रिप्ट की .innerText() विधि (.txt फ़ाइल या कुछ के बजाय) का उपयोग करके इस दस्तावेज़ को दस्तावेज़ से एकत्र कर रहा हूं, इसलिए मुझे यकीन नहीं है कि "मुझे 8 केबी दें डेटा "- यह वही है जो मैं खोज रहा हूं, हालांकि। – Bungle

1

डोमिनिक कहते हैं, वर्ण एन्कोडिंग समस्या है - लेकिन अगर आप या तो वास्तव में सुनिश्चित कर सकते हैं कि आप केवल 8 बिट वर्ण के साथ सौदा होगा (संभावना नहीं है, लेकिन संभव है) या 16-बिट वर्ण मान और आधे तक सीमित उपलब्ध स्थान, यानी 40 9 6 वर्ण तो आप इसका प्रयास कर सकते हैं।

इसके लिए जेएस पर भरोसा करना एक बुरा विचार है, हालांकि इसे छोटा रूप से संशोधित या अनदेखा किया जा सकता है और उदाहरण के लिए निपटने के लिए आपको बचने के पात्रों और एन्कोडिंग की जटिलताएं हैं। जेएस का उपयोग पहली मौके फ़िल्टर के रूप में करने के लिए बेहतर है और जो भी सर्वर-साइड भाषा उपलब्ध है उसका उपयोग करें (जो संपीड़न भी खुल जाएगा)।

+0

धन्यवाद, अन्नकाटा - ऐसा लगता है कि बॉबन्स के काम मेरे मामले में काम करेंगे। ज़ेमेन्टा को वास्तव में 8 केबी सीमा पर किसी भी पाठ को काटना चाहिए, इसलिए मुझे अंततः उनके एपीआई (बैंडविड्थ को संरक्षित करने के अलावा) के बारे में कोई चिंता नहीं है, क्योंकि इस उदाहरण में अधिकतम प्रदर्शन लाभ सीमित हो जाएगा ग्राहक पक्ष पर कम से कम 8 केबी। – Bungle

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