| | 2259 | #if HAVE_GLIB |
| | 2260 | gchar *p1,*p2,*pp; |
| | 2261 | r=g_utf8_normalize(s,-1,G_NORMALIZE_ALL); |
| | 2262 | if(!r) { |
| | 2263 | pp=g_strdup(s); |
| | 2264 | if(!g_utf8_validate(pp,-1,&p1)) { |
| | 2265 | if(p1) { |
| | 2266 | dbg(0,"Invalid utf8 string %s will be cut at byte pos %d\n", p1-pp); |
| | 2267 | *p1=0; |
| | 2268 | r=g_utf8_normalize(s,-1,G_NORMALIZE_ALL); |
| | 2269 | } |
| | 2270 | if(!r) { |
| | 2271 | dbg(0,"Unable to fix broken utf8 string %s\n",s); |
| | 2272 | r=g_strdup(""); |
| | 2273 | } |
| | 2274 | } |
| | 2275 | g_free(pp); |
| | 2276 | } |
| | 2277 | for(p1=r,p2=r;*p1;) { |
| | 2278 | gunichar c=g_utf8_get_char(p1); |
| | 2279 | pp=g_utf8_next_char(p1); |
| | 2280 | if(!g_unichar_iszerowidth(c)) { |
| | 2281 | memmove(p2,p1,pp-p1); |
| | 2282 | p2+=pp-p1; |
| | 2283 | } |
| | 2284 | p1=pp; |
| | 2285 | } |
| | 2286 | *p2=0; |
| | 2287 | pp=g_utf8_casefold(r,-1); |
| | 2288 | g_free(r); |
| | 2289 | r=pp; |
| | 2290 | #else |