Rewrite IS_IN_SET, everything is ok. But I don't know how to submit a branch .
class IS_IN_SET(Validator): def __init__( self, theset, labels=None, error_message='value not allowed', multiple=False, zero='', sort=False, ): self.multiple = multiple if isinstance(theset, dict): self.theset = [str(item) for item in theset.keys()] self.labels = theset.values() elif theset and isinstance(theset, (tuple,list)) \ and isinstance(theset[0], (tuple,list)) and len(theset[0])==2: self.theset = [str(item) for item,label in theset] self.labels = [str(label) for item,label in theset] else: self.theset = [str(item) for item in theset] self.labels = labels self.error_message = error_message self.zero = zero self.sort = sort def options(self): if not self.labels: items = [(k, k) for (i, k) in enumerate(self.theset)] else: items = [(k, self.labels[i]) for (i, k) in enumerate(self.theset)] if self.sort: items.sort(options_sorter) if self.zero != None and not self.multiple: items.insert(0,('',self.zero)) return items def __call__(self, value): if self.multiple: if isinstance(value, str): values = [value] elif isinstance(value, (tuple, list)): values = value else: values = [value] failures = [x for x in values if not x in self.theset] if failures: if self.multiple and value == None: return (value, None) return (value, self.error_message) if self.multiple: return ('|%s|' % '|'.join(values), None) return (value, None) On 3月30日, 上午11时12分, hywang <why00...@163.com> wrote: > thanks for your kindly help. > > On 3月30日, 上午1时47分, Yarko Tymciurak <resultsinsoftw...@gmail.com> > wrote: > > > On Mar 29, 10:54 am, Yarko Tymciurak <resultsinsoftw...@gmail.com> > > wrote: > > > > anyway, I am sure this is about encoding to unicode - someone who has > > > done this will hopefully add comments. > > > For example, looking > > athttp://docs.python.org/library/codecs.html#standard-encodings > > > and searching for Chinese, from your (pasted) example, I found two > > decodings that result in unicode results (that is, the codecs > > recognize): > > > In [37]: value=r"老李" > > In [38]: value > > Out[38]: '\xe8\x80\x81\xe6\x9d\x8e' > > In [39]: value.decode('gbk') > > Out[39]: u'\u9470\u4f79\u6f55' > > In [40]: value.decode('gb18030') > > Out[40]: u'\u9470\u4f79\u6f55' > > > IMPORTANT: both of these results show a unicode result (i.e. > > u'xxxx') > > > I am not sure if you need to set LOCALE for your environment / browser > > so that the regular expression to work as it is (but, with this > > encoding, it correctly produces the unicode match when callred with > > re.UNICODE flag - but this is without locale set (off the top of my > > head, I am not sure of the proper way to setlocale within an > > interpreter, to test this...) > > > In [44]: val=value.decode('gbk') > > In [45]: re.compile(r"[\w\-:]+",re.U).findall(val) > > Out[45]: [u'\u9470\u4f79\u6f55'] > > > I hope this helps begin to show the beginning of the way: All your > > strings in your app need to be converted to unicode (one way or > > another), and your locale set (normally provided from the browser, in > > the request). > > > - Yarko > > > > On Mar 29, 10:04 am, Yarko Tymciurak <resultsinsoftw...@gmail.com> > > > wrote: > > > > > On Mar 29, 8:33 am, hywang <why00...@163.com> wrote: > > > > > > -------model file is like this --------------------- > > > > > db.define_table('options_contain_chinease', > > > > > Field('student_name', requires = IS_IN_SET(["Jim","小长","老李"], > > > > > multiple=True)), > > > > > Using this last string from your IS_IN_SET example (I hope my copy/ > > > > paste did this correctly into iPython!): > > > > > In [31]: value=r"老李" > > > > In [32]: value > > > > Out[32]: '\xe8\x80\x81\xe6\x9d\x8e' > > > > In [33]: str(value) > > > > Out[33]: '\xe8\x80\x81\xe6\x9d\x8e' > > > > In [34]: re.compile(r"[\w\-:]+").findall(value) > > > > Out[34]: [] > > > > In [35]: re.compile(r"[\w\-:]+").findall(value, re.U) > > > > Out[35]: [] > > > > In [36]: re.compile(r"[\w\-:]+",re.U).findall(value) > > > > Out[36]: ['\xe8', '\xe6'] > > > > In [37]: re.compile(r"[\w\-:]+",re.U).findall(value,re.U) > > > > Out[37]: [] > > > > > ---> > > > > > So it would seem you may need to setup something with LOCALE; I have > > > > played around with this for just a little bit, but am not sure what it > > > > takes (zh-CN? zh-cn? zh_CN.gb2312? etc.) > > > > > Maybe others can add to this... > > > > > Regards, > > > > - Yarko > > > > > > ) > > > > > db.options_contain_chinease.student_name.widget = > > > > > CheckboxesWidget.widget > > > > > > ------controller file is like this --------------------- > > > > > def options_contain_chinease(): > > > > > form = SQLFORM(db.options_contain_chinease) > > > > > if form.accepts(request.vars, session): > > > > > pass > > > > > return dict(form=form) > > > > > > if checked one item and submit, everything is ok, however, when > > > > > checked more than one items and submit the form, an error will occur . > > > > > Is it a bug ? > > > > > > thanks ! -- You received this message because you are subscribed to the Google Groups "web2py-users" group. To post to this group, send email to web...@googlegroups.com. To unsubscribe from this group, send email to web2py+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/web2py?hl=en.