iT邦幫忙

0

javascript 的 substring 會有亂碼

發現有些中文字,用 substring 取內容,會有亂碼:

https://ithelp.ithome.com.tw/upload/images/20191027/20017351SvTjneYpJF.png

但一般中文字又不會:
https://ithelp.ithome.com.tw/upload/images/20191027/20017351DdNGXx5i19.png

什麼時候該用 substring(0,1) ,什麼時候又該用 substring(0,2)?

2
淺水員
iT邦研究生 5 級 ‧ 2019-10-27 14:21:27
最佳解答

參考 utf16

let test_str='?北市';

function utf16_substring(str, start, end)
{
	let idx_1=0,count=0,n=str.length;
	for(count=0; idx_1<n && count<start; ++count) {
		idx_1+=str.codePointAt(idx_1)>0xffff?2:1;
	}
	let idx_2=idx_1;
	for(; idx_2<n && count<end; ++count) {
		idx_2+=str.codePointAt(idx_2)>0xffff?2:1;
	}
	return str.substring(idx_1, idx_2);
}

console.log(test_str.substring(0, 2));
console.log(utf16_substring(test_str, 0, 2));
看更多先前的回應...收起先前的回應...
dragonH iT邦超人 6 級 ‧ 2019-10-27 15:36:31 檢舉

/images/emoticon/emoticon32.gif

Brandon iT邦新手 4 級 ‧ 2019-10-27 16:28:52 檢舉

/images/emoticon/emoticon06.gif

只能如此 hard code 了?

淺水員 iT邦研究生 5 級 ‧ 2019-10-27 20:05:59 檢舉

內建函數目前我還沒找到,目前我這邊現有解法就是這樣了。

我下面有解釋了,只能自已這樣幹了。
其實原因也不過是substring它們認識的中文。只局限於big5碼的中文。其它中文字它不認識,就將其當字元處理了。

3
dragonH
iT邦超人 6 級 ‧ 2019-10-27 12:40:57
let c = '魚桀北市' // ?北市;

你可以用 console.log(c.length)

會發現長度為 4

也就是說 魚桀 這個字

長度為 2

解決的方法可以用個例外來特別處裡

會這樣的

應該也是少數

口桀口桀口桀

Brandon iT邦新手 4 級 ‧ 2019-10-27 16:25:13 檢舉

事實上我是想抓 "?魚坑路" 這個字串的第一個字,這個字串是不定長度的,所以您說的用長度來判斷並不太適合

dragonH iT邦超人 6 級 ‧ 2019-10-27 16:37:32 檢舉

Brandon

我沒有說用長度判斷阿 /images/emoticon/emoticon17.gif

我是說你這情況的原因而已

至於解法 淺水員大 有貼了我就不貼了

他那個不算 hardcode

簡單來說就是算出真正要切的位置來切

1
浩瀚星空
iT邦超人 1 級 ‧ 2019-10-27 14:22:15

javascript的中文字視1長度的。只限於在big5能使用的中文字。其它字還是會被視為2或3的長度。
大多數來說。如果有中文字截斷的處理。我是不會用javascript的截斷處理。

那怎麼辦??無法信任 substring 截取方式??
那就只好自已寫啦!!或是網路上找找其它處理的方式了。

我要發表回答

立即登入回答