2012-12-05 13 views
12

मेरे पास एक Django ऐप है जो ट्विटर के एपीआई से ट्वीट डेटा लेता है और इसे एक MySQL डेटाबेस में सहेजता है। जहां तक ​​मुझे पता है (मैं अभी भी चरित्र एन्कोडिंग के बेहतर बिंदुओं के आसपास अपना सिर प्राप्त कर रहा हूं) मैं हर जगह यूटीएफ -8 का उपयोग कर रहा हूं, जिसमें माईएसक्यूएल एन्कोडिंग और टकराव भी शामिल है, जो एक ट्वीट में इमोजी वर्ण शामिल हैं, ठीक है, मैं समझता हूं कि चार-बाइट एन्कोडिंग का उपयोग करें। उन्हें बचाने के लिए कोशिश कर रहा है Django से निम्न चेतावनी का उत्पादन:मैं अपने इनपुट से इमोजी वर्णों को कैसे फ़िल्टर कर सकता हूं ताकि मैं MySQL <5.5 में सहेज सकूं?

/home/biggleszx/.virtualenvs/myvirtualenv/lib/python2.6/site-packages/django/db/backends/mysql/base.py:86 : चेतावनी: गलत स्ट्रिंग मान: '\ xF0 \ x9F \ X98 \ xAD मैं ...' कॉलम 'पाठ' के लिए पंक्ति 1 वापसी self.cursor.execute (क्वेरी, args)

मैं पर MySQL 5.1 का उपयोग करके, utf8mb4 का उपयोग तब तक एक विकल्प नहीं है जब तक कि मैं 5.5 तक अपग्रेड नहीं करता, जो कि मैं अभी तक नहीं चाहता हूं (जो मैंने पढ़ा है उससे भी, इसके लिए Django का समर्थन काफी उत्पादन-तैयार नहीं है, हालांकि यह हो सकता है अब सटीक नहीं होगा)। मैंने folks को भी प्रभावित कॉलम पर टेक्स्ट के बजाय बीएलओबी के उपयोग की सलाह दी है, जो मैं भी नहीं करता क्योंकि मुझे लगता है कि यह प्रदर्शन को नुकसान पहुंचाएगा।

मेरा सवाल यह है कि, मुझे लगता है कि मुझे ट्वीट सामग्री के लगभग 100% संरक्षण पर भी परेशान नहीं है, क्या मैं एक तरीका है कि मैं सभी इमोजी पात्रों को फ़िल्टर कर सकता हूं और उन्हें एक गैर-मल्टीबाइट चरित्र के साथ बदल सकता हूं, जैसे कि आदरणीय WHITE MEDIUM SMALL SQUARE (U+25FD)? मुझे लगता है कि यह मेरा वर्तमान सेटअप दिया गया डेटा सहेजने का सबसे आसान तरीका है, हालांकि अगर मुझे एक और स्पष्ट समाधान याद आ रहा है, तो मुझे यह सुनना अच्छा लगेगा!

एफवाईआई, मैं उबंटू 10.04.4 एलटीएस पर स्टॉक पायथन 2.6.5 का उपयोग कर रहा हूं। sys.maxunicode 1114111 है, इसलिए यह एक यूसीएस -4 बिल्ड है।

पढ़ने के लिए धन्यवाद।

+0

UTF8 गैर सांकेतिक शब्दों में बदलना कर सकते हैं बीएमपी पात्र – SLaks

+3

@ स्लक्स: हाँ, लेकिन 'utf8' MySQL charset उन्हें स्टोर नहीं कर सकता क्योंकि यह केवल 3 बाइट्स का उपयोग करता है। –

उत्तर

21

तो यह पता चला है कि इसका उत्तर कुछ बार दिया गया है, मुझे मौजूदा प्रश्नों को ढूंढने के लिए Google- fu सही नहीं मिला है।

import re 
try: 
    # UCS-4 
    highpoints = re.compile(u'[\U00010000-\U0010ffff]') 
except re.error: 
    # UCS-2 
    highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') 
# mytext = u'<some string containing 4-byte chars>' 
mytext = highpoints.sub(u'\u25FD', mytext) 
:

Martijn Pieters के लिए धन्यवाद, समाधान नियमित अभिव्यक्ति, विशेष रूप से इस कोड की दुनिया से आया है (ऊपर पहली कड़ी के लिए अपने जवाब के आधार पर)

जिस चरित्र को मैं प्रतिस्थापित कर रहा हूं वह WHITE MEDIUM SMALL SQUARE (U+25FD) है, एफवाईआई, लेकिन कुछ भी हो सकता है।

यूसीएस से अपरिचित लोगों के लिए, मेरे जैसे, यह यूनिकोड रूपांतरण के लिए एक प्रणाली है और पाइथन के दिए गए निर्माण में यूसीएस -2 या यूसीएस -4 संस्करण के लिए समर्थन शामिल होगा, जिनमें से प्रत्येक पर एक अलग ऊपरी सीमा है चरित्र समर्थन।

इस कोड को जोड़ने के साथ, स्ट्रिंग्स MySQL 5.1 में ठीक रहती प्रतीत होती हैं।

आशा है कि यह किसी भी स्थिति में किसी और की सहायता करेगी!

13

मैंने बिगल्सज़एक्स द्वारा समाधान का प्रयास किया और यह [इमोजी के विकिपीडिया लेख] पढ़ने के बाद दिल की इमोजी (❤) के लिए चिंता नहीं कर रहा था [1] मैंने देखा है कि नियमित अभिव्यक्ति सभी इमोजीज़ को कवर नहीं कर रही है जबकि यूनिकोड की अन्य श्रृंखला को भी शामिल किया गया है जो इमोजी नहीं हैं।

emoji_block0 = re.compile(u'[\U00002600-\U000027BF]') 
emoji_block1 = re.compile(u'[\U0001f300-\U0001f64F]') 
emoji_block2 = re.compile(u'[\U0001f680-\U0001f6FF]') 

:

emoji_symbols_pictograms = re.compile(u'[\U0001f300-\U0001f5fF]') 
emoji_emoticons = re.compile(u'[\U0001f600-\U0001f64F]') 
emoji_transport_maps = re.compile(u'[\U0001f680-\U0001f6FF]') 
emoji_symbols = re.compile(u'[\U00002600-\U000026FF]') 
emoji_dingbats = re.compile(u'[\U00002700-\U000027BF]') 

उन ब्लॉकों तीन ब्लॉक (यूसीएस -4) में विलय कर दिया जा सकता है:

निम्नलिखित कोड 5 रेगुलर एक्सप्रेशन कि मानक में 5 इमोजी ब्लॉकों को कवर बनाने यूसीएस -2 में उनके समकक्ष हैं:

emoji_block0 = re.compile(u'[\u2600-\u27BF]') 
emoji_block1 = compile(u'[\uD83C][\uDF00-\uDFFF]') 
emoji_block1b = compile(u'[\uD83D][\uDC00-\uDE4F]') 
emoji_block2 = re.compile(u'[\uD83D][\uDE80-\uDEFF]') 

तो आखिर में हम एक नियमित नियमित रूप से परिभाषित कर सकते हैं एक साथ सभी मामलों के साथ है xpression:

import re 
try: 
    # UCS-4 
    highpoints = re.compile(u'([\U00002600-\U000027BF])|([\U0001f300-\U0001f64F])|([\U0001f680-\U0001f6FF])') 
except re.error: 
    # UCS-2 
    highpoints = re.compile(u'([\u2600-\u27BF])|([\uD83C][\uDF00-\uDFFF])|([\uD83D][\uDC00-\uDE4F])|([\uD83D][\uDE80-\uDEFF])') 
# mytext = u'<some string containing 4-byte chars>' 
mytext = highpoints.sub(u'\u25FD', mytext) 
0

मैं वहाँ एक और नियमित रूप से expresion कि emojis की पहचान करने में सक्षम है पाया। इस regex instagram-enginnering ब्लॉग पर टीम द्वारा प्रदान की जाती है

u"(?<!&)#(\w|(?:[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u2388\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|(?:0\u20E3|1\u20E3|2\u20E3|3\u20E3|4\u20E3|5\u20E3|6\u20E3|7\u20E3|8\u20E3|9\u20E3|#\u20E3|\\*\u20E3|\uD83C(?:\uDDE6\uD83C(?:\uDDEB|\uDDFD|\uDDF1|\uDDF8|\uDDE9|\uDDF4|\uDDEE|\uDDF6|\uDDEC|\uDDF7|\uDDF2|\uDDFC|\uDDE8|\uDDFA|\uDDF9|\uDDFF|\uDDEA)|\uDDE7\uD83C(?:\uDDF8|\uDDED|\uDDE9|\uDDE7|\uDDFE|\uDDEA|\uDDFF|\uDDEF|\uDDF2|\uDDF9|\uDDF4|\uDDE6|\uDDFC|\uDDFB|\uDDF7|\uDDF3|\uDDEC|\uDDEB|\uDDEE|\uDDF6|\uDDF1)|\uDDE8\uD83C(?:\uDDF2|\uDDE6|\uDDFB|\uDDEB|\uDDF1|\uDDF3|\uDDFD|\uDDF5|\uDDE8|\uDDF4|\uDDEC|\uDDE9|\uDDF0|\uDDF7|\uDDEE|\uDDFA|\uDDFC|\uDDFE|\uDDFF|\uDDED)|\uDDE9\uD83C(?:\uDDFF|\uDDF0|\uDDEC|\uDDEF|\uDDF2|\uDDF4|\uDDEA)|\uDDEA\uD83C(?:\uDDE6|\uDDE8|\uDDEC|\uDDF7|\uDDEA|\uDDF9|\uDDFA|\uDDF8|\uDDED)|\uDDEB\uD83C(?:\uDDF0|\uDDF4|\uDDEF|\uDDEE|\uDDF7|\uDDF2)|\uDDEC\uD83C(?:\uDDF6|\uDDEB|\uDDE6|\uDDF2|\uDDEA|\uDDED|\uDDEE|\uDDF7|\uDDF1|\uDDE9|\uDDF5|\uDDFA|\uDDF9|\uDDEC|\uDDF3|\uDDFC|\uDDFE|\uDDF8|\uDDE7)|\uDDED\uD83C(?:\uDDF7|\uDDF9|\uDDF2|\uDDF3|\uDDF0|\uDDFA)|\uDDEE\uD83C(?:\uDDF4|\uDDE8|\uDDF8|\uDDF3|\uDDE9|\uDDF7|\uDDF6|\uDDEA|\uDDF2|\uDDF1|\uDDF9)|\uDDEF\uD83C(?:\uDDF2|\uDDF5|\uDDEA|\uDDF4)|\uDDF0\uD83C(?:\uDDED|\uDDFE|\uDDF2|\uDDFF|\uDDEA|\uDDEE|\uDDFC|\uDDEC|\uDDF5|\uDDF7|\uDDF3)|\uDDF1\uD83C(?:\uDDE6|\uDDFB|\uDDE7|\uDDF8|\uDDF7|\uDDFE|\uDDEE|\uDDF9|\uDDFA|\uDDF0|\uDDE8)|\uDDF2\uD83C(?:\uDDF4|\uDDF0|\uDDEC|\uDDFC|\uDDFE|\uDDFB|\uDDF1|\uDDF9|\uDDED|\uDDF6|\uDDF7|\uDDFA|\uDDFD|\uDDE9|\uDDE8|\uDDF3|\uDDEA|\uDDF8|\uDDE6|\uDDFF|\uDDF2|\uDDF5|\uDDEB)|\uDDF3\uD83C(?:\uDDE6|\uDDF7|\uDDF5|\uDDF1|\uDDE8|\uDDFF|\uDDEE|\uDDEA|\uDDEC|\uDDFA|\uDDEB|\uDDF4)|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C(?:\uDDEB|\uDDF0|\uDDFC|\uDDF8|\uDDE6|\uDDEC|\uDDFE|\uDDEA|\uDDED|\uDDF3|\uDDF1|\uDDF9|\uDDF7|\uDDF2)|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C(?:\uDDEA|\uDDF4|\uDDFA|\uDDFC|\uDDF8)|\uDDF8\uD83C(?:\uDDFB|\uDDF2|\uDDF9|\uDDE6|\uDDF3|\uDDE8|\uDDF1|\uDDEC|\uDDFD|\uDDF0|\uDDEE|\uDDE7|\uDDF4|\uDDF8|\uDDED|\uDDE9|\uDDF7|\uDDEF|\uDDFF|\uDDEA|\uDDFE)|\uDDF9\uD83C(?:\uDDE9|\uDDEB|\uDDFC|\uDDEF|\uDDFF|\uDDED|\uDDF1|\uDDEC|\uDDF0|\uDDF4|\uDDF9|\uDDE6|\uDDF3|\uDDF7|\uDDF2|\uDDE8|\uDDFB)|\uDDFA\uD83C(?:\uDDEC|\uDDE6|\uDDF8|\uDDFE|\uDDF2|\uDDFF)|\uDDFB\uD83C(?:\uDDEC|\uDDE8|\uDDEE|\uDDFA|\uDDE6|\uDDEA|\uDDF3)|\uDDFC\uD83C(?:\uDDF8|\uDDEB)|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C(?:\uDDF9|\uDDEA)|\uDDFF\uD83C(?:\uDDE6|\uDDF2|\uDDFC))))[\ufe00-\ufe0f\u200d]?)+ 

स्रोत: http://instagram-engineering.tumblr.com/post/118304328152/emojineering-part-2-implementing-hashtag-emoji

ध्यान दें: के रूप में यह एक अपने पिछले जवाब यहाँ के complemetary नहीं है मैं एक और उत्तर जोड़ें।

0

मैं जेसन एन्कोडर फ़ंक्शन का उपयोग कर रहा हूं जो इनपुट को एन्कोड करता है।

यह फ़ंक्शन json.dumps पर dict एन्कोडिंग (इसे स्ट्रिंग में कनवर्ट करने के लिए) के लिए उपयोग किया जाता है। (ताकि हम जवाबी कार्रवाई के लिए कुछ संपादित करने की जरूरत है - को दूर ' "')

इस mysql के लिए इमोजी को बचाने के लिए, और यह मौजूद है (वेब ​​पर) मेरे सक्षम:

# encode input 
from json.encoder import py_encode_basestring_ascii 
name = py_encode_basestring_ascii(name)[1:-1] 

# save 
YourModel.name = name 
name.save() 
संबंधित मुद्दे

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