2021年8月29日 星期日

VSCode gcc 執行時中文亂碼解決

vscode gcc 執行 C++ 中文亂碼解決

tags: 部落格文章

亂碼原因

其實就只是出在編碼的轉亂過程中沒有正確的被設置而已,這邊還會引申出另一個問題「許功蓋問題」都是相同原因導致的。

導致亂碼的原因

其實最主要的是中間隔了一層gcc,很多人沒注意到gcc是可以決定輸入的編碼和輸出編碼的。

這邊先順一下總共有4層,每一層編碼都要一致才能正確地顯示。

  1. 檔案編碼 (預設big5)
  2. gcc輸入設置 (預設utf8)
  3. gcc輸出設置 (預設utf8)
  4. windows編碼設置 (繁體系統-預設big5)

檔案編碼

檔案編碼是最好解的,直接從VS的右下角可以看到當前是什麼


點擊一下可以看到兩個選項


  1. 當你打開一份big5的檔案,但是VS卻錯誤判斷成utf8開啟,就會發生亂碼,這時候只要[重新以big5開啟]即可
  2. 當你打開一份big5的檔案,想把檔案編碼轉換成utf8的時候,這時候[以utf8編碼儲存]即可

用哪個編碼都可以沒有好壞,考慮到繁體Windwos預設就是big5,國內環境直接使用big5會帶來很大的便利性。
但是如果你的客戶包含海外用戶,那使用big5就會帶來災難了。所以網頁代碼一律用utf8才是最省事的。

ggc設置

其實這才是卡到大家bug亂碼的根源,關鍵在於它的預設值是utf8導致災難。

這個設置還不只是有一個輸出輸入各一個,所謂的許功蓋問題就從這裡的,檔案是big5但是gcc預設用utf8讀,這編碼不匹配就出問題了。

不知道為什麼早期的文章沒人意識到其實有選項可以調,所以結論就變成必須得用uft8了。

這邊提供一下選項,有兩個一個是讀取,一個執行。

# 設置原始程式檔案之編碼為 big5 (忽略不打預設是utf8)
-finput-charset=big5
# 設定執行時之編碼方式為 big5 (忽略不打預設是utf8)
-fexec-charset=big5

這邊選項1依據你的文檔是什麼格式做調整就好,如果是utf8格式的文檔直接刪除即可,預設就用utf8讀取。

下面兩個範例

# 原始檔編碼為utf8 (預設就是utf8直接省略)
gcc a.cpp -fexec-charset=big5

# 原始檔編碼為big5
gcc a.cpp -finput-charset=big5 -fexec-charset=big5

「設定執行之編碼方式」只能是 big5 這個別想了沒得改,這裡的編碼並不是網路上寫的終端機的編碼,是系統內部的。

windows編碼設置

這個其實網路上很多文章有寫要調整powershell或cmd的編碼,其實跟那邊無關。

真正的設定值在這裡



但是我不建議改動這裡,到時候會變成你打開別的程式是亂碼。只要這裡不改上面的指令2就一定得打

為什麼玩日文遊戲要特別用第三方程式轉換問題也是出在這裡,光是改系統語言並不會改變編碼。

【解決方法2】現在win10也解決這個問題了,編碼那裏點進去有個實驗功能,「使用UTF8提供全球語言支持」把他打勾之後,直接什麼什麼煩惱都沒有,就能正確顯示中文了。只是會有什麼代價還不清楚,我是沒打算這樣改就是了。


最後回到vscode

好啦關鍵那兩個指令拉,把他加入你的joson檔案裡gcc指令後面就可以解決了。

參考

http://kailotus.blogspot.com/2018/10/c06c-vscode-cvscode.html

2021年8月15日 星期日

新注音快速輸入標點符號

新注音快速輸入標點符號

其實早期舊版Win10的新注音有提供用多選項可以讓我們選,其中有一個比較好用的不知道為什麼新版的拿掉了,找半天找不到最後是還原舊版才找到的。趕緊記錄一下,這功能覺得蠻實用的之後要找可能會找不到。

切舊版

新版似乎不是拿掉這個功能,而是沒把這個功能的選項給做出來直接隱藏掉了,如果要開啟只能先切到舊版的開完之後再切回來。


進來之後滾到最下面



免確認快速輸入標點符號

一般我們打標點符號有幾種辦法,最常見的應該是按 波浪+句號 這樣他就會自動出來的,不過有個缺點是按完之後會進入選字模式還要自己再按一次enter才能輸入。

還有一個辦法是按  CTRL+句號 ,哪個好用自己按習慣就好,我個人是覺得按CTRL比較快速,但是就是不能像波浪見一樣分開按小小的缺點。


有個選項可以直接輸出不用再多按一次,配合這個做法其實如果是打字打到斷句的時候,直接輸出一個句號可以省下按下一次enter的次數。

那個選項在這個地方


怎麼來的直接在右下角的輸入法圖標按右鍵內容就有。新版的直接整合成跟Win10的UI一樣的介面,這個介面是按不出這個設定選項的。




取消 Ctrl+標點符號 的輸入方式

這個是我一直很想搞掉的,因為輸入法劫持了 CTRL+[ 的快捷鍵,導致在很多編輯器上要按這個快捷鍵都按不出來,只能切別的輸入法才能按。

其實也可以進那個階選項裡面關掉


只是可惜的是,不給活路呀!關是能關掉了確實按 CTRL+[ 也沒有輸出標點符號了,但是還是一樣沒辦法驅動快捷鍵,看來這個關閉只有做半套就是單純沒有輸出而已,但是還是有偵測輸入導致快捷被劫持了,只能放棄了。

2021年8月8日 星期日

Powershell 利用正則表達式 去除雙引號

Powershell 利用正則表達式 去除雙引號

tags: 部落格文章

這幾天遇到一個問題是CSS檔案裏面存在著大量的錯誤與法,顏色的代碼前後被上雙引號了,網頁差不多是15年前的產物了吧,那時候IE還沒這麼嚴苛或是標準還沒訂這麼細是能過得。

Powershell中使用正則表達式

有幾種方式最常見的是 -match 這只能回傳 bool 數值並不是這次要的這次是用了 -replace

還有一個問題是,Powershell 系統內建是 5.1 版,這個版本可不能處理非系統 encoding 和無 BOM的UTF8 這部分怎麼處理可以看之前的文章。簡單說就是升級到 7.1 就完事了。

[PowerShell 如何輸出 不帶BOM的 UTF-8 檔案](https://charlottehong.blogspot.com/2021/04/powershell-bom-utf-8.html

-replace

替代這個真的很好用。廢話不多說直接上代碼演示

$Text = "Copyright (C) Microsoft Corporation. 著作權所有,並保留一切權利。"
$Text -replace "Microsoft", "CHG"

直接就把原本內文中的 Microsoft 替換成 CHG 了。就大概這麼個用法。

其中有一個比較特別的用法是 $1 這個會回傳你的正則條件搜到的東西,就比如說這次的目標是要找到顏色代碼,但是我事先並不知道代碼是多少,我只能寫條件找到代碼,然後代碼要留著我要替除的是前後的引號。比如以下的示範

$ct = '#head_top{color: "#FFFFFF"};'
$dstStr = $ct -replace '"#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})"', '#$1';
$dstStr

如此一來就可以把雙引號給去除了,剩下的工作就是把檔案讀取進來還有寫入。檔案讀取的時候如果需要過濾清單可以參考底下另一個用法。




-match

另外補充一下這個語法,最常見的是用來判斷文本裡面是否有目標字串,結果只會返回 True 跟 False 比如底下這樣的寫法。

# 文本
$Text = "Copyright (C) Microsoft Corporation. 著作權所有,並保留一切權利。"
# 搜尋是否有 Microsoft
$Text -match "Microsoft"

後面的地方是可以寫正則表達式的,有需要再自己嘗試一下。
然後正則搜到的什麼東西可以用 $matches[0] 來檢視

'#FFFFFF' -match '#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})'
$matches[0]

可以獲取顏色的代碼


獲取括號內的內容可以用這樣 (注意裡面的idx是用1)

'#head_top{color: (Abc123$#@%)};' -match '\((.*?)\)'
$matches[1]





進階應用

除了可以用來搜之外,其實還有一個特別的用法,可以用來剔除陣列中的東西

比如說我要排除特定檔名 txt 剩下的都保留,下面是檔案清單。先自己照著創各種不同類型的副檔名,直接創txt然後改副檔名就好。

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          2021/8/8  下午 01:33              0 main.cpp
-a----          2021/8/8  下午 01:33              0 note.txt
-a----          2021/8/8  下午 01:33              0 README.md

實際上的代碼

$FileItem = Get-ChildItem
$FileItem = $FileItem -notmatch ".txt$"
$FileItem

這樣就自動剔除 txt 結尾的副檔名了。
可以注意到我是用反過的帶有 no 的語法,如果反過來想指定白名單的話是這樣

$FileItem = Get-ChildItem
$FileItem = $FileItem -match ".cpp$|.md$"
$FileItem

可能有人會想到,不對呀 Get-ChildItem 本身就有過濾的 -filter 指令幹嘛還自己寫。雖然結果是一樣的,但其實兩者效能上有一點點區別。

還有最大的一點是能過濾資料夾!本身自帶的過濾器只能過濾附檔名是不能過濾資料夾的,比如說我讀取一個多層資料夾,裡面有一個 “.git” 文件我不想讀,這時候 -nomatch 就很好用了。這東西是用正則去判斷路徑的字串,自由度就非常高了。

2021年8月6日 星期五

git fork diff 比較 的時候中文亂碼

git fork diff 比較 的時候中文亂碼

其實這是git的問題,用任何圖形化工具也好都是吃git的API輸出比較的,包含vscode也是。在這些工具上比較的時候出現亂碼都可以設定。

fork這個工具本身是自帶git的,所以如果你要設定fork的亂碼問題要到fork的文件底下找到他自帶的git從裡面設定才有用。

如果是vscode上比較的亂碼直接修改安裝在系統上的git即可,或是你自己指定了位置就到那個位置去修改。

修改 Encodin 編碼

其實就只是 Big5 轉 utf8 所產生的問題而已,修改的方式到這個這資料去

# fork的git
%USERPROFILE%\AppData\Local\Fork\gitInstance\2.30.2\etc 

# 系統的git
C:\Program Files\Git\etc

底下有兩個文件是我們要修改的檔案,兩個都得改

gitconfig

# 日文
[diff "cp932"]
  textconv=iconv -f cp932 -t utf-8

# 中文

[diff "cp950"]
  textconv=iconv -f cp950 -t utf-8

gitattributes

# 日文
*.java  diff=cp932
*.sql   diff=cp932
*.xml   diff=cp932
*.html  diff=cp932
*.xsl   diff=cp932
*.css   diff=cp932
*.cpp   diff=cp932
*.hpp   diff=cp932
*.c     diff=cp932
*.h     diff=cp932

# 中文
*.java  diff=cp950
*.sql   diff=cp950
*.xml   diff=cp950
*.html  diff=cp950
*.xsl   diff=cp950
*.css   diff=cp950
*.cpp   diff=cp950
*.hpp   diff=cp950
*.c     diff=cp950
*.h     diff=cp950

需要什麼文檔在自己擴充,填完重新整理就好了

2021年8月3日 星期二

VScode + git 攜帶版如何把設置擋放在文件夾內而不是使用者文件

VScode + git 攜帶版如何把設置擋放在文件夾內而不是使用者文件

2022-10-07
事隔一年多找到最優解了,如果環境變數能從軟體設置當然是設置就完事了,關鍵是VsCode裡面有不少好用的外掛程序,外掛要讀或是甚至自己在終端機要用也會用不了。

關鍵的解法 Git攜帶版 要比要舒服的使用還是直接新增環境變數吧,兩個方式一個是啟動前在終端機加上臨時變數,然後再給終端機委託啟動。

$env:Path = $env:Path + "C:\git\bin"

另一個是直接加到使用者環境變數而不是系統。為什麼會卡到這個問題最大的原因也是因為公司的電腦基本沒管理員權限的。加到使用者就沒問題了

$UserPath = System.Environment]::GetEnvironmentVariable("PATH", "User")
System.Environment]::SetEnvironmentVariable("PATH", "$UserPath;C:\git\bin", "User")


如果電腦C曹使用者文件被封鎖沒有存取權限,又想要設置User層級的 gitconfig 的話可以更改git的家目錄,設定檔在 git\etc\profile 這檔案裡任意位置加上一行 Home="指定的位置" 就可以改了。




以下是從VsCode上直接設定git位置的舊文,因為有些副作用在建議用上面的做法。










這問題爬好我好一段時間,不知道為什麼沒什麼人提到,雖然說明是有的只是關鍵不知道怎麼下繞了好長的遠路,大概整理一下怎麼弄

VScode

首先先到官方下載,官方本身就有提供攜帶版的,只不過資料還是存在使用文件就是了。要怎麼才能把文件存在攜帶版的資料夾內。

其實就只是在 code.exe 的旁邊建立一個 data 的資料夾就好了,程式會自動會把設定跟擴展檔案丟在裡面。

Git for windows

這個問題更棘手一點,也是沒關鍵字很難找,雖然這個官方本身也是提供攜帶版,但是不知道為什麼設置擋還是存在使用者文件,我所在的環境就是沒權限存在使用者文件,打開直接就報錯…

查了很多文章基本上主流都是用一個 bat 檔來強制導入環境變數,雖然一開始我也是這個思路,但是所在環境嚴苛直接不給跑bat

繞了好大一圈發現其實直接在VScode內設置git的位置就好,然後還要到git內設置全域的gitconfig,設置之後就不會去讀使用者文件的gitconfig了

設置的方式直接點左下角齒輪,打開設置然後搜尋 git.path 自動引導到自制,選擇到 setting.json 內設置,他會幫你補上開頭,直接把git路徑丟進去就好

進去的時候路徑的斜線要自己打成兩個斜線,比如說

"git.path": "C:\\Program Files\\Git\\bin\\git.exe"

這樣就可以過了,剩下的問題就是終端機有時候需要手動輸入命令還是得建立一下。

新增終端機的語法有更新過,網路上大半都舊的不是很好用。大概記錄一新的樣式代碼。

"terminal.integrated.profiles.windows": {
        "UserDefGit": {
            "path": "C:\\Program Files\\Git\\bin\\bash.exe",
            "icon": "terminal-bash"
        }
    }

就長這樣啦,直接看就能理解了。想換圖標可以把後面整串砍掉自己手打 termi 就會跳出有哪些圖標可以用了。

如果要設置某個終端機為預設終端機,每次打開會優先打開的終端可以多打一行

"terminal.integrated.defaultProfile.windows": "UserDefGit"

後面的名稱要配合你自己寫的標籤名稱。你也可以直接從右下角的新增終端的時候,最下面有一個選擇預設值,直接按也可以按完設定會自己跑出上面那行。

最後如何輸入gitconfig位置在

git\etc

這裡是全域設置檔,我不知道怎麼搞出使用者設置擋,但至少全域設置是有效的,這招我從fork上面看來的,在fork上輸入的使用資訊也是存在自帶的git全域設置上。

2021年8月1日 星期日

git 還原刪除的分支 branch

如何 還原 錯誤被 刪除 的 branch

說來悲劇我在用Fork刪除本地分支的時候不小心勾選到刪除伺服器上的,導致服務器上的分支也被刪除了。沒弄回來我們這群人這幾個月的活都白幹了…好在是有找回來,下面記錄一下流程。



搜尋被刪除的分支

分支被刪除之後就丟失信息了,唯一能查的只有當前還沒有被git清理掉的野指標(reachable commit)有哪些


查詢野指標 (連按三下選取一行)

git fsck --full --no-reflogs --unreachable --lost-found | grep commit


這樣就能查到了,更進階一點可以把commit信息查出來(連按三下選取一行)

git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 --pretty=oneline

如此一來就可以更方便查找正確的提交點了

如果想要查看更詳細的提交的時間、上色等,可以這樣用。

git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 \
    --date=format:'%Y-%m-%d %H:%M:%S' \
    --pretty=format:"%C(reset)[%cd] %C(yellow)%h %C(cyan)<%cn> %C(reset)%s" 

更詳細的提交信息如何查看,可以看官方的說明:https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%9F%A5%E7%9C%8B%E6%8F%90%E4%BA%A4%E5%8E%86%E5%8F%B2


只不過這個搜尋到的是當前野指標,之前刪除過的分支也會存在沒辦法區分開。預設的刪除自動回收垃圾的時間是兩周,兩周內產生的野指標保證都會在。

只能自己看提交信息過濾,至少能保證被你幹掉的分支一定能找回來。只是可能會有多餘的提交點,多的東西時間久了一定會知道,沒時間過濾就先放著吧。


2023-10-19

追加一個顯示前一個節點的,雖然有試圖只顯示所有分之的最後結點,不過寫起來太長了,拿到這個資料之後,自己再丟程式處理

git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 \
    --date=format:'%Y-%m-%d %H:%M:%S' \
    --pretty=format:"%C(reset)[%cd] %C(yellow)%h%C(green) <-%p %C(cyan)<%cn> %C(reset)%s" 




重建分支

分支名稱可以當作是提交點的名別,這個資訊刪掉就沒了,沒辦法得知這個提交點過去是哪個分支,通常提交都會有規範要一併打上分支的名字,可以順著這個名字重建回來。如果沒有那就只能靠自己回想了,或是找到要復原的提交點在自己想個新的建立吧。

還原方式是先在找到所需要的提交點建立新的分支(取新的別名)即可。建立分支有兩種方式,任選一個就好。

# 建立新分支,並切換到新分支
git checkout "提交點的哈希碼" -b "要重建的新分支名"

# 建立新分支,停留在原本分支不切換
git branch "要重建的新分支名" "提交點的哈希碼"

這樣就能還原被刪除的分支了,一個一個慢慢還原就好



參考