2014-03-12 75 views
0

我正在開發Windows 8/8.1 JavaScript應用程序。它基本上是我們web應用程序的一個端口。對於部署,我使用grunt,grunt-contrib-uglify和grunt-contrib-cssmin(接近一些,但那些沒有連接到我的問題)。Windows應用程序開發中的Grunt和UglifyJS - UTF8問題

UglifyJS用於打包我所有的JS文件和庫因爲Windows應用程序認證強制使用帶有簽名(BOM)的UTF-8編碼,所以我的所有源文件都以這種方式編碼。我也設置了將默認編碼爲UTF-8並將preserveBOM設置爲true。但我的縮小文件在us_ascii中編碼,有些甚至在二進制流中編碼。

對於Windows 8.1 32位和Mac OS小牛,這種行爲是相同的

我該怎麼辦?

使用UTF-8 BOM編碼重新保存此打包版本會導致通過認證檢查,但應用程序未運行(白色屏幕,看起來像縮小的JS不再工作,但它在重新打開之前完美無瑕,保存)。

這就是我與之後的JS文件做CONCAT /縮小:

var buf = grunt.file.read(fileName, { encoding: null }); 
var missingBOM = (buf[0] !== 0xEF && buf[1] !== 0xBE && buf[2] !== 0xBB); 
if (missingBOM) { 
    grunt.file.write(fileName, '\ufeff' + buf, { encoding: 'utf-8' }); 
} 

更新: 我發現有多個BOM表在我的合併文件,所以我改進我的腳本脫光那些寫出來的新前:

var buf = grunt.file.read(dist + fileName, { encoding: null }); 
var BOM = new Buffer([0xEF,0xBB,0xBF]); 

// remove multi BOMs from Buffer 
var bufString = buf.toString('utf-8'); 
bufString = bufString.replace(BOM.toString('utf-8'), null); 
buf = new Buffer(bufString, 'utf-8'); 

// add new UTF-8 BOM to the beginning of the file buffer 
var bomFile = Buffer.concat([BOM,buf]); 
grunt.file.write(dist + fileName, bomFile, { encoding: 'utf-8' }); 

儘管如此,沒有運氣-.-

回答

0

真正的問題似乎是醜化合併文件和BOM的組合。 我當前的設置會縮小每個JS文件,但不會再合併它們(因爲Windows應用程序將本地存儲所有腳本,所以請求不成問題)。我在最後使用我的主帖的更新2中的代碼片段將BOM添加到所有這些BOM中。

我的應用程序現在成功驗證並運行完美。唷...

0

我的猜測是,它爲y我們的Windows加載錯誤的字符集。您是否在您的html頁面中設置了字符集,以便強制瀏覽器使用UTF-8加載它?

它似乎是如何加載文件,而不是如何生成/縮小問題。

鏈接:http://www.w3.org/International/questions/qa-html-encoding-declarations

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
</body> 
</html> 
+0

燁執行uglify,元定義是存在的。我現在也通過手動將BOM添加到文件中來獲得正確的編碼。現在剩下的唯一問題是,該應用程序只在調試器存在時才起作用。如果我打開打包和安裝的應用程序,我會以白色屏幕結束(所有應用程序UI均由JS構建)。如果我調試安裝的應用程序,它的運行完美無瑕 –

1

我有一個類似的問題,雖然很多情況下diffic,所以不知道如果解決方案會爲你工作。

uglify unescapes並將\u0000和其他Unicode編碼的regexps轉換爲utf-8。

嘗試的選項ascii-only=truebeautify=false

更多的討論at this uglify issue