在 「JS / 在blogger利用javascript偵測IP位址,判斷是否顯示”修改”與複製時是否增加”版權聲明”」
使用NotebookLM做語音摘要,在內容有提到一段程式碼沒有在內文中說明
NotebookLM判斷應該是處理中文字元的程序,這點是沒有錯
這個函式主要是處理複製時,新增的版權內容,其中標點符號會被轉譯成Html字元實體參照,如下
"本文作者:莊生趣味" + "\n" + "本文連結:" + s + "\n" + "版權聲明:轉載請標明作者、連結與出處!"
wordpress沒有這個問題,在blogger不知道是什麼機制導致
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function ToChinese2(e) { //console.log(e); var code = e.split(/&#(\d+);/g); //console.log(code); var c = ""; for (var i = 0; i < code.length; i++) { var d = String.fromCharCode(code[i]); //console.log(d); if (d == String.fromCharCode("a")) { //console.log("o"); //console.log(code[i]); c = c + code[i]; //console.log(c); } else { //console.log("x"); c = c + d; //console.log(c); } //console.log(c); //alert(c); } return c; } |
程式碼基本流程是將文字內容傳入
然後根據 &#+數字+; 的格式利用正則表達式搭配 split 分割字串
這樣字串”本文作者:莊生趣味” + “\n” + “本文連結:” + s + “\n” + “版權聲明:轉載請標明作者、連結與出處!”
就會分割成陣列[“本文作者”,”65306″,”莊生趣味 本文連結”,”65306″,…..]
再用 String.fromCharCode(),如果參數是非數字,例如文字,會回傳空值的特性
透過判斷式來處理字串
當傳入文字,不需要轉換,直接串接字串
當傳入數字,利用String.fromCharCode()來取得 Unicode 字符,再串接字串
最終回傳串接完成的字串
這個方法式參考網站https://ascii.chacd.com/轉換編碼的程式
因為這個網站把程式直接寫在網頁內
利用瀏覽器的檢查功能,可以知道按下轉換按鈕會觸發 ToChinese()
在網頁內搜尋 ToChinese(),可以完整的程式碼
調整編排後的程式碼
1 2 3 4 5 6 7 8 9 |
function ToChinese(e) { console.log(e); var code = e.match(/&#(\d+);/g); console.log(code); var c = ""; for (var i = 0; i < code.length; i++) c += String.fromCharCode(code[i].replace(/[&#;]/g, "")); console.log(c); } |
所以我用我的理解改成可以串接字串的函式
(印像中應該有參考其他網站資料,但是找不到了)
我後來把程式碼丟給chatGTP跟DeepSeek
請他們解釋我改寫的程式碼
他們都提到String.fromCharCode(“a”)有邏輯上的錯誤
但是他們都能夠理解這個程式想要達到的效果
所以給了相同的修改建議
兩者都是用 replace()將/&#(\d+);/g篩選出來的字串,利用String.fromCharCode()轉換成新字串
程式碼非常簡潔
chatGPT
1 2 3 4 5 |
function ToChinese2(e) { return e.replace(/&#(\d+);/g, function(match, dec) { return String.fromCharCode(parseInt(dec, 10)); }); } |
DeepSeek
1 2 3 4 5 |
function ToChinese2(e) { return e.replace(/&#(\d+);/g, function(m, code) { return String.fromCharCode(code); }); } |