Repository: joke2k/faker

Issue:
the email is invalid when use locale='zh_CN'
fake = Factory.create(locale='zh_CN')
print fake.company_email()
print fake.email()

Then output:
秀兰87@维旺明信息有限公司.org
x越@gmail.com
it's a invalid email, and the other (free_email etc) email function in the same, 



Discussion:
to expand a little, the issue here is that email addresses can only contain Latin letters.

also in the condition, fake = Factory.create(locale='zh_CN'), the  website also have the same problem, u'http://www.\u65f6\u7a7a\u76d2\u6570\u5b57\u79d1\u6280\u6709\u9650\u516c\u53f8.biz/' -----http://www.时空盒数字科技有限公司.biz/   

Hi @fengdy ,

we'll need to compile a list of romanized common names to use. I've been looking at https://en.wikipedia.org/wiki/List_of_common_Chinese_surnames and https://en.wikipedia.org/wiki/Chinese_given_name#Common_Chinese_names and it looks like 'Pinyin' would be the de-facto 'standard' romanization. The only issue is that those names still contain accented letters, which are outside of the ascii range. Would it be appropriate to use that romanization and simply strip the accents?

Hi,
Same issue when the locale contains characters with accents (éèàô etc...)

@fcurella 

> [...] it looks like 'Pinyin' would be the de-facto 'standard' romanization. The only issue is that those names still contain accented letters, which are outside of the ascii range. Would it be appropriate to use that romanization and simply strip the accents?

I would say yes. This is pretty much what Chinese people will do when confronted with an ascii-only form.  Technically you can write the tones (i.e. the accents) by appending numbers (e.g. mā  má  mǎ  -> ma1 ma2 ma3), but I've never seen anyone do that in this context.

Also there is also the use of ü, which isn't actually a tonal mark, but indicates a change in vowel sound.  Stripping the umlaut in this case is approximately the same as stripping them from the German ü.


Resolving patch:
diff --git a/faker/providers/internet/zh_CN/__init__.py b/faker/providers/internet/zh_CN/__init__.py
new file mode 100644
--- /dev/null
+++ b/faker/providers/internet/zh_CN/__init__.py
@@ -0,0 +1,18 @@
+# coding=utf-8
+from __future__ import unicode_literals
+from .. import Provider as InternetProvider
+from faker.utils.decorators import slugify
+
+
+class Provider(InternetProvider):
+    user_name_formats = (
+        '{{last_romanized_name}}.{{first_romanized_name}}',
+        '{{first_romanized_name}}.{{last_romanized_name}}',
+        '{{first_romanized_name}}##',
+        '?{{last_romanized_name}}',
+    )
+    tlds = ('com', 'com', 'com', 'net', 'org', 'cn', 'cn', 'cn')
+
+    @slugify
+    def domain_word(self):
+        return self.generator.format('last_romanized_name')
diff --git a/faker/providers/person/zh_CN/__init__.py b/faker/providers/person/zh_CN/__init__.py
--- a/faker/providers/person/zh_CN/__init__.py
+++ b/faker/providers/person/zh_CN/__init__.py
@@ -5,48 +5,100 @@
 
 class Provider(PersonProvider):
     formats = ["{{last_name}}{{first_name}}", ]
-    first_names = ["伟", "芳", "娜", "敏", "静", "秀英", "丽", "强", "磊", "洋", "艳", "勇", "军", "杰", "娟",
-                   "涛", "超", "明", "霞", "秀兰", "刚", "平", "燕", "辉", "玲", "桂英", "丹", "萍", "鹏", "华",
-                   "红", "玉兰", "飞", "桂兰", "英", "梅", "鑫", "波", "斌", "莉", "宇", "浩", "凯", "秀珍", "健",
-                   "俊", "帆", "雪", "帅", "慧", "旭", "宁", "婷", "玉梅", "龙", "林", "玉珍", "凤英", "晶", "欢",
-                   "玉英", "颖", "红梅", "佳", "倩", "阳", "建华", "亮", "成", "琴", "兰英", "畅", "建", "云", "洁",
-                   "峰", "建国", "建军", "柳", "淑珍", "春梅", "海燕", "晨", "冬梅", "秀荣", "瑞", "桂珍", "莹", "秀云",
-                   "桂荣", "志强", "秀梅", "丽娟", "婷婷", "玉华", "兵", "雷", "东", "琳", "雪梅", "淑兰", "丽丽", "玉",
-                   "秀芳", "欣", "淑英", "桂芳", "博", "丽华", "丹丹", "彬", "桂香", "坤", "想", "淑华", "荣", "秀华",
-                   "桂芝", "岩", "杨", "小红", "金凤", "文", "利", "楠", "红霞", "建平", "瑜", "桂花", "璐", "凤兰"]
-
-    last_names = ["赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "诸", "卫", "蒋", "沈", "韩", "杨",
-                  "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜",
-                  "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎",
-                  "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐",
-                  "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常",
-                  "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄",
-                  "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧",
-                  "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "粱",
-                  "杜", "阮", "蓝", "闵", "席", "季", "麻", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭",
-                  "梅", "盛", "林", "刁", "钟", "徐", "邱", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍",
-                  "虞", "万", "支", "柯", "咎", "管", "卢", "莫", "经", "房", "裘", "缪", "干", "解", "应", "宗",
-                  "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉", "钮", "龚",
-                  "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀", "羊", "於", "惠", "甄", "魏", "家", "封",
-                  "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "弓",
-                  "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫",
-                  "宁", "仇", "栾", "暴", "甘", "钭", "厉", "戎", "祖", "武", "符", "刘", "景", "詹", "束", "龙",
-                  "叶", "幸", "司", "韶", "郜", "黎", "蓟", "薄", "印", "宿", "白", "怀", "蒲", "邰", "从", "鄂",
-                  "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阴", "郁", "胥", "能", "苍", "双",
-                  "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍",
-                  "却", "璩", "桑", "桂", "濮", "牛", "寿", "通", "边", "扈", "燕", "冀", "郏", "浦", "尚", "农",
-                  "温", "别", "庄", "晏", "柴", "翟", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼", "容",
-                  "向", "古", "易", "慎", "戈", "廖", "庚", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘",
-                  "匡", "国", "文", "寇", "广", "禄", "阙", "东", "殴", "殳", "沃", "利", "蔚", "越", "夔", "隆",
-                  "师", "巩", "厍", "聂", "晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空",
-                  "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红",
-                  "游", "竺", "权", "逯", "盖", "益", "桓", "公", "万", "俟", "司", "马", "上", "官", "欧", "阳",
-                  "夏", "侯", "诸", "葛", "闻", "人", "东", "方", "赫", "连", "皇", "甫", "尉", "迟", "公", "羊",
-                  "澹", "台", "公", "冶", "宗", "政", "濮", "阳", "淳", "于", "单", "于", "太", "叔", "申", "屠",
-                  "公", "孙", "仲", "孙", "轩", "辕", "令", "狐", "钟", "离", "宇", "文", "长", "孙", "慕", "容",
-                  "鲜", "于", "闾", "丘", "司", "徒", "司", "空", "亓", "官", "司", "寇", "仉", "督", "子", "车",
-                  "颛", "孙", "端", "木", "巫", "马", "公", "西", "漆", "雕", "乐", "正", "壤", "驷", "公", "良",
-                  "拓", "跋", "夹", "谷", "宰", "父", "谷", "粱", "晋", "楚", "闫", "法", "汝", "鄢", "涂", "钦",
-                  "段", "干", "百", "里", "东", "郭", "南", "门", "呼", "延", "归", "海", "羊", "舌", "微", "生",
-                  "岳", "帅", "缑", "亢", "况", "后", "有", "琴", "梁", "丘", "左", "丘", "东", "门", "西", "门",
-                  "商", "牟", "佘", "佴", "伯", "赏", "南", "宫", "墨", "哈", "谯", "笪", "年", "爱", "阳", "佟"]
+    first_names = [
+        "伟", "芳", "娜", "敏", "静", "秀英", "丽", "强", "磊", "洋", "艳", "勇", "军", "杰", "娟",
+        "涛", "超", "明", "霞", "秀兰", "刚", "平", "燕", "辉", "玲", "桂英", "丹", "萍", "鹏", "华",
+        "红", "玉兰", "飞", "桂兰", "英", "梅", "鑫", "波", "斌", "莉", "宇", "浩", "凯", "秀珍", "健",
+        "俊", "帆", "雪", "帅", "慧", "旭", "宁", "婷", "玉梅", "龙", "林", "玉珍", "凤英", "晶", "欢",
+        "玉英", "颖", "红梅", "佳", "倩", "阳", "建华", "亮", "成", "琴", "兰英", "畅", "建", "云", "洁",
+        "峰", "建国", "建军", "柳", "淑珍", "春梅", "海燕", "晨", "冬梅", "秀荣", "瑞", "桂珍", "莹", "秀云",
+        "桂荣", "志强", "秀梅", "丽娟", "婷婷", "玉华", "兵", "雷", "东", "琳", "雪梅", "淑兰", "丽丽", "玉",
+        "秀芳", "欣", "淑英", "桂芳", "博", "丽华", "丹丹", "彬", "桂香", "坤", "想", "淑华", "荣", "秀华",
+        "桂芝", "岩", "杨", "小红", "金凤", "文", "利", "楠", "红霞", "建平", "瑜", "桂花", "璐", "凤兰",
+    ]
+
+    last_names = [
+        "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "诸", "卫", "蒋", "沈", "韩", "杨",
+        "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜",
+        "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎",
+        "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐",
+        "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常",
+        "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄",
+        "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧",
+        "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "粱",
+        "杜", "阮", "蓝", "闵", "席", "季", "麻", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭",
+        "梅", "盛", "林", "刁", "钟", "徐", "邱", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍",
+        "虞", "万", "支", "柯", "咎", "管", "卢", "莫", "经", "房", "裘", "缪", "干", "解", "应", "宗",
+        "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉", "钮", "龚",
+        "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀", "羊", "於", "惠", "甄", "魏", "家", "封",
+        "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "弓",
+        "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫",
+        "宁", "仇", "栾", "暴", "甘", "钭", "厉", "戎", "祖", "武", "符", "刘", "景", "詹", "束", "龙",
+        "叶", "幸", "司", "韶", "郜", "黎", "蓟", "薄", "印", "宿", "白", "怀", "蒲", "邰", "从", "鄂",
+        "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阴", "郁", "胥", "能", "苍", "双",
+        "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍",
+        "却", "璩", "桑", "桂", "濮", "牛", "寿", "通", "边", "扈", "燕", "冀", "郏", "浦", "尚", "农",
+        "温", "别", "庄", "晏", "柴", "翟", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼", "容",
+        "向", "古", "易", "慎", "戈", "廖", "庚", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘",
+        "匡", "国", "文", "寇", "广", "禄", "阙", "东", "殴", "殳", "沃", "利", "蔚", "越", "夔", "隆",
+        "师", "巩", "厍", "聂", "晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空",
+        "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红",
+        "游", "竺", "权", "逯", "盖", "益", "桓", "公", "万", "俟", "司", "马", "上", "官", "欧", "阳",
+        "夏", "侯", "诸", "葛", "闻", "人", "东", "方", "赫", "连", "皇", "甫", "尉", "迟", "公", "羊",
+        "澹", "台", "公", "冶", "宗", "政", "濮", "阳", "淳", "于", "单", "于", "太", "叔", "申", "屠",
+        "公", "孙", "仲", "孙", "轩", "辕", "令", "狐", "钟", "离", "宇", "文", "长", "孙", "慕", "容",
+        "鲜", "于", "闾", "丘", "司", "徒", "司", "空", "亓", "官", "司", "寇", "仉", "督", "子", "车",
+        "颛", "孙", "端", "木", "巫", "马", "公", "西", "漆", "雕", "乐", "正", "壤", "驷", "公", "良",
+        "拓", "跋", "夹", "谷", "宰", "父", "谷", "粱", "晋", "楚", "闫", "法", "汝", "鄢", "涂", "钦",
+        "段", "干", "百", "里", "东", "郭", "南", "门", "呼", "延", "归", "海", "羊", "舌", "微", "生",
+        "岳", "帅", "缑", "亢", "况", "后", "有", "琴", "梁", "丘", "左", "丘", "东", "门", "西", "门",
+        "商", "牟", "佘", "佴", "伯", "赏", "南", "宫", "墨", "哈", "谯", "笪", "年", "爱", "阳", "佟",
+    ]
+
+    romanized_formats = (
+        '{{first_romanized_name}} {{last_romanized_name}}',
+    )
+
+    # From https://en.wikipedia.org/wiki/Chinese_given_name#Common_Chinese_names,
+    # with accents stripped
+    first_romanized_names = (
+        'Chao', 'Fang', 'Gang', 'Guiying', 'Jie', 'Jing', 'Juan', 'Jun', 'Lei',
+        'Li', 'Min', 'Ming', 'Na', 'Ping', 'Qiang', 'Tao', 'Wei', 'Xia', 'Xiulan',
+        'Xiuying', 'Yang', 'Yong', 'Yan',
+    )
+
+    # From https://en.wikipedia.org/wiki/List_of_common_Chinese_surnames
+    # with accents stripped
+    last_romanized_names = (
+        'Bai', 'Cai', 'Cao', 'Chang', 'Chen', 'Cheng', 'Cui', 'Dai', 'Deng',
+        'Ding', 'Dong', 'Du', 'Duan', 'Fan', 'Fang', 'Feng', 'Fu', 'Gao', 'Gong',
+        'Gu', 'Guo', 'Han', 'Hao', 'He', 'Hou', 'Hu', 'Huang', 'Jia', 'Jiang',
+        'Jin', 'Kang', 'Kong', 'Lai', 'Lei', 'Li', 'Liang', 'Liao', 'Lin', 'Liu',
+        'Long', 'Lu', 'Luo', 'Ma', 'Mao', 'Meng', 'Mo', 'Pan', 'Peng', 'Qian',
+        'Qiao', 'Qin', 'Qiu', 'Ren', 'Shao', 'Shen', 'Shi', 'Song', 'Su', 'Sun',
+        'Tan', 'Tang', 'Tao', 'Tian', 'Wan', 'Wang', 'Wei', 'Wen', 'Wu', 'Xia',
+        'Xiang', 'Xiao', 'Xie', 'Xiong', 'Xu', 'Xue', 'Yan', 'Yang', 'Yao', 'Ye',
+        'Yi', 'Yin', 'Yu', 'Yuan', 'Zeng', 'Zhang', 'Zhao', 'Zheng', 'Zhong',
+        'Zhou', 'Zhu', 'Zou',
+    )
+
+    def romanized_name(self):
+        '''
+        @example 'Chao Bai'
+        '''
+        pattern = self.random_element(self.romanized_formats)
+        return self.generator.parse(pattern)
+
+    @classmethod
+    def first_romanized_name(cls):
+        '''
+        @example 'Chao'
+        '''
+        return cls.random_element(cls.first_romanized_names)
+
+    @classmethod
+    def last_romanized_name(cls):
+        '''
+        @example 'Chao'
+        '''
+        return cls.random_element(cls.last_romanized_names)


Test patch: