Ver código fonte

处理特殊的中文标点符号造成的json解析失败bug

xiexiaoyuan 2 anos atrás
pai
commit
cf4b8e4f5a
2 arquivos alterados com 52 adições e 7 exclusões
  1. 2 2
      models/tables/day_new/wework_msg.go
  2. 50 5
      services/day_new.go

+ 2 - 2
models/tables/day_new/wework_msg.go

@@ -97,14 +97,14 @@ func GetWeworkMsgByConditionLimit(condition string, pars []interface{}, limit in
 	return
 }
 
-func MultiUpdateContentEn(multiSql string, updateSendIds string) (err error)  {
+func MultiUpdateContentEn(multiSql string, updateSendIds string, pars []interface{}) (err error)  {
 	o := orm.NewOrm()
 	sql := `UPDATE wework_msg 
 SET modify_time=NOW(), content_en =
 CASE id `+multiSql+` END 
 WHERE 
 	id IN (`+updateSendIds+` ) `
-	_, err = o.Raw(sql).Exec()
+	_, err = o.Raw(sql, pars).Exec()
 	return
 }
 

+ 50 - 5
services/day_new.go

@@ -258,6 +258,7 @@ func DayNewTranslateContent() (err error) {
 	count := 0
 	contentMap := make(map[string]string, 0)
 	contentEnMap := make(map[string]string)
+	var ups []interface{}
 	for _, v := range list {
 		//如果单条翻译的字符数超过1000,则直接翻译,否则批量翻译
 		if len(v.Content) > 1000 {
@@ -267,7 +268,8 @@ func DayNewTranslateContent() (err error) {
 				return
 			}
 			needChangeIds += strconv.Itoa(int(v.Id)) + ","
-			multi += ` WHEN `+strconv.Itoa(int(v.Id))+` THEN "`+ en +`"`
+			multi += ` WHEN `+strconv.Itoa(int(v.Id))+` THEN ?`
+			ups = append(ups, en)
 		}else{
 			if count >= 50 {  //待翻译的条数不能超过50; 单条翻译字符数不能超过1000字符
 				contentEnMap, err = batchTranslateHandler(contentMap)
@@ -277,12 +279,13 @@ func DayNewTranslateContent() (err error) {
 				// 拼接更新sql
 				for rk, rv := range contentEnMap {
 					needChangeIds += rk + ","
-					multi += ` WHEN `+rk+` THEN "`+ rv +`"`
+					multi += ` WHEN `+rk+` THEN ?`
+					ups = append(ups, rv)
 				}
 				contentMap = make(map[string]string, 0)
 				count = 0
 			}
-			contentMap[strconv.Itoa(int(v.Id))] = v.Content
+			contentMap[strconv.Itoa(int(v.Id))] = dealPunctuationToEn(v.Content)
 			count += 1
 		}
 	}
@@ -295,13 +298,14 @@ func DayNewTranslateContent() (err error) {
 		// 拼接更新sql
 		for rk, rv := range contentEnMap {
 			needChangeIds += rk + ","
-			multi += ` WHEN `+rk+` THEN "`+ rv +`"`
+			multi += ` WHEN `+rk+` THEN ?`
+			ups = append(ups, rv)
 		}
 	}
 
 	if needChangeIds != "" {
 		needChangeIds = strings.Trim(needChangeIds, ",")
-		err = day_new.MultiUpdateContentEn(multi, needChangeIds)
+		err = day_new.MultiUpdateContentEn(multi, needChangeIds, ups)
 		if err != nil {
 			err = errors.New(fmt.Sprintf("更新翻译后的内容失败 err: %v", err))
 			return
@@ -319,5 +323,46 @@ func batchTranslateHandler(contentMap map[string]string) (contentEnMap map[strin
 	}
 	//json转为map数据结构
 	err = json.Unmarshal([]byte(en), &contentEnMap)
+	for k, v := range contentEnMap {
+		contentEnMap[k] = strings.ReplaceAll(v,`{quot}`, `"`)
+	}
 	return
 }
+
+var punctuationMap = map[rune]rune{
+
+	8216: 34, // '
+
+	8217: 34, // '
+
+	8220: 34, // "  //把“符号转换成
+
+	8221: 34, // "  //把”符号转换成
+
+	12298: 34, // "    //把《 符号转换成
+
+	12299: 34, // "     //把 》符号转换成
+
+	12304: 91, // [    //把【 符号转换成
+
+	12305: 93, // ]     //把 】符号转换成
+
+	12302: 91, // [    //把『符号转换成
+
+	12303: 93, // ]     //把 』符号转换成
+}
+
+func dealPunctuationToEn(text string) string {
+	text = strings.Map(func(r rune) rune {
+
+		if v, ok := punctuationMap[r]; ok {
+			return v
+
+		}
+		return r
+
+	}, text)
+	text = strings.ReplaceAll(text,`"`,`{quot}`)
+	return text
+}
+