2016年6月3日星期五

使用PowerShell多層資料夾大量轉換檔案繁簡中文

前幾天公司叫我把一個ASP.NET MVC專案由繁體中文轉換成簡體中文,
雖然都知道只是轉字不轉語法,但要求是這樣都沒辦法。
第一時間就想到用古法知名的ConvertZ,但原來ConvertZ只是支援一層資料夾,並不支援Recursive轉換檔案。

還是自己乖乖做小程式,網上一些文章介紹兩種方法,
一是引用VisualBasic.Runtime的Strings.StrConv功能,
二是引用Microsoft Office的Microsoft.Office.Interop.Word中的簡繁互換,
但公司是英文版Office,沒提供Language Pack,所以沒有安裝那個中文繁簡轉換增益集。
最後只可以選擇前者,但完成後,發現轉換不到簡體,既沒有亂碼,
檔案都是有修改過,但文字原封不動。
不知道是否英文Windows + 英文.NET Framework影響,都沒有研究下去。

突然想起之前SSIS專案用過Uniconv,(見UniConv - 超強轉碼工具 BIG5/GB/UTF8/Unicode)
Uniconv除了轉換內碼如Big5,UTF8等等,還可以繁簡轉換的。
花了一點時間研究如何用CMD做Loop之後.......
還是使用PowerShell更簡單。

完成後的程式碼如下:

#取得所有主資料夾和子資料夾所有檔案,可自行設定Filter
$files_table = Get-ChildItem -Path "C:\Source\MVCSite" -Include *.cshtml,*.cs -Recurse
#建立暫存資料夾供uniconv使用
$temp_folder = "C:\Source\Translated\"
foreach ($file in $files_table)
{
    #取得個別檔案所在的路徑
    $origin_folder = Split-Path -Path $file.fullname
    #複製至暫存資料夾的路徑
    $temp_file = $temp_folder + $file.Name
    #uniconv命令行
    $arg = 'UTF8 "' + $file.FullName + '" UTF8 "' + $temp_file + '" ToSimplifiedChinese'
    #write-host是debug用,類似echo或debug.print
    #write-host $arg 
    #啟動uniconv, wait參數是等待一個程序完成才執行下一個
    Start-Process -FilePath "C:\uniconv\uniconv.exe" -Wait -ArgumentList $arg
    #複製回原本的資料夾
    Copy-Item -Path $temp_file -Destination $origin_folder -Force
    #刪除暫存檔案
    Remove-Item $temp_file
}
程序上沒太多技術細節,但我轉換了多層資料夾,大量檔案都沒有問題,而且速度都很快。

要在PowerShell執行多行程序可以使用";"分號代替LineBreak。
$files_table = Get-ChildItem -Path "C:\Source\MVCSite" -Include *.cshtml,*.cs -Recurse;$temp_folder = "C:\Source\Translated\";foreach ($file in $files_table){ $origin_folder = Split-Path -Path $file.fullname;$temp_file = $temp_folder + $file.Name;$arg = 'UTF8 "' + $file.FullName + '" UTF8 "' + $temp_file + '" ToSimplifiedChinese';Start-Process -FilePath "C:\uniconv\uniconv.exe" -Wait -ArgumentList $arg;Copy-Item -Path $temp_file -Destination $origin_folder -Force;Remove-Item $temp_file;}

參考:
[C#].net的簡繁轉換
CODE-封裝Office繁簡轉換服務
用vb.net自製一個簡繁互換!!不用再開Word去互換

2016年4月10日星期日

Google Webfont的思源黑體(Noto Sans TC)中文測試

上年年尾Google公佈Noto Sans字形時,一直都有留意住。
因為一直都並未有比較好看而免費的web font可以使用,相信大多數設計網頁的人還在使用"微軟正黑體"為主。
其實微軟正黑體並不差,由2000年的Windows XP時代走到2015,依然是很多人使用的預設繁體中文字體。
但在現今高解析度的螢幕下就顯得有不足。

當時Google的Webfont服務並未有同步包含這個字形,所以一直無緣使用在網頁上。
上幾個星期,得知Google Fonts的Early Access頁面已經可以使用Noto Sans CJK就立即在自己的Blog上測試一下。

前往Early Access頁面,搜索"Noto Sans TC"就可以找得到。
至於如何使用Webfont,大家就自行Google搜尋了。

測試一下Noto Sans TC使用效果 :

1. 在微軟正黑體 / 14px的字形下是這樣,大家應該都見慣這樣式。
font-family: 'Microsoft JhengHei', '微軟正黑體', Verdana, Arial, 'Microsoft YaHei' !important;
font-size:14px;



2. 使用Noto Sans TC後,在單純14px的情況下,其實會更得更醜,
font-family: 'Noto Sans TC', 'Microsoft JhengHei', '微軟正黑體', Verdana, Arial, 'Microsoft YaHei' !important;
font-size:14px;



3. 主要原因是我未加font-weight去控制粗幼,Noto Sans TC的Font Weight預設是Regular 400,所以我加上font-weight: 300後,雖然字體幼了,但不會比微軟正黑體好看。
font-family: 'Noto Sans TC', 'Microsoft JhengHei', '微軟正黑體', Verdana, Arial, 'Microsoft YaHei' !important;
font-size:14px;
font-weight:300;



4. 來到這裡,我耍了一些手段,令字體更有圓滑,我加上text-shadow:#999 0.01em 0.01em 0.05em !important,是不是開始有感覺了。
font-family: 'Noto Sans TC', 'Microsoft JhengHei', '微軟正黑體', Verdana, Arial, 'Microsoft YaHei' !important;
font-size:14px;
font-weight:300;
text-shadow:#999 0.01em 0.01em 0.05em !important



5.若果我把font-weight設回400,字體會更見結實。


所以我最後得出的結果是,視乎你使用情況而定,你可以微調font-size和font-weight得出最好的結果。
有關Noto Sans TC的font-weight可以參考官方文件 - https://www.google.com/get/noto/#sans-hant
如果你是完美主義者的話,可以再加上以下CSS做反鋸齒。
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-smooth: always;


值得一提的是Noto Sans TC在手機上有非常出色的效果,即使大量文字在最光的螢幕下看起來都十分舒服。


最後我在jsfiddle上建立了範例,大家可以用這個玩一玩測試一下。