

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Command &#8211; MaxCodeReview</title>
	<atom:link href="https://codereview.max-everyday.com/tag/command/feed/" rel="self" type="application/rss+xml" />
	<link>https://codereview.max-everyday.com</link>
	<description>分享Max收集的小程式</description>
	<lastBuildDate>Sat, 17 Jan 2026 14:46:16 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://codereview.max-everyday.com/wp-content/uploads/2020/07/cropped-logo1_x512-32x32.jpg</url>
	<title>Command &#8211; MaxCodeReview</title>
	<link>https://codereview.max-everyday.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>從字體專案裡刪除特定文字</title>
		<link>https://codereview.max-everyday.com/delete-selected-glyph/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Tue, 09 Nov 2021 19:19:24 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1546</guid>

					<description><![CDATA[為什麼要學這個？ 與使用「人工」手動去處理相 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>與使用「人工」手動去處理相比，用程式去刪除特定文字有效率。</p>



<p>這個程式與另外2個程式，有一點點相似，如果是使用 copy_lost_out.py 或使用 copy_selected_out.py 是無法處理「複雜的」字型檔，如果使用了 .vert 檔案 或是設定了 kerning 之類的設定值，暫時還沒有寫程式去使判斷。</p>



<p>延伸的問題是，要避免直接複製.glyph 到 font forage 專案的目錄裡，遇到複雜的字型檔時，會造成 kerning 之類的設定值錯亂，因為共用的外部檔案的編號會相同，所以要合併複雜的字型時，請使用 Font Forge 的 Merge Font&#8230; 來合併。</p>



<p>重要：刪除檔案前，請先一定要做要備份，因為會救不回來！有提供參數 &#8211;check_only , 就不會刪除任何檔案.</p>



<p>下面提供3種解法來處理, 本篇文章是解法1:</p>



<ul class="wp-block-list">
<li><a href="#delete_selected_glyph">解法1: 透過 python 處理 fontforge 匯出的專案目錄.</a></li>
</ul>



<p>建議改用下面2篇文章的解法, 效率更高。</p>



<ul class="wp-block-list">
<li>解法2: 透過 fontforge 開啟字型檔, 從字串或文字檔移除目標<br><a href="https://codereview.max-everyday.com/clear_glyph/">https://codereview.max-everyday.com/clear_glyph/</a></li>



<li>解法3: 透過 fontforge 開啟2個字型檔, 字型檔移除字型檔包含項目<br><a href="https://codereview.max-everyday.com/font_delete_font/">https://codereview.max-everyday.com/font_delete_font/</a></li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">前置作業</h2>



<p>使用前，需要先安裝FontForge，把要處理的字體先存成.sfdir 的資料夾格式。</p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading" id="delete_selected_glyph">解法1: 透過 python 處理 fontforge 匯出的專案目錄.</h2>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/delete_selected_glyph.py" target="_blank" rel="noreferrer noopener">https://github.com/max32002/MaxFontScripts/blob/master/delete_selected_glyph.py</a></p>



<p><strong>使用方法:</strong></p>



<pre class="wp-block-code"><code>delete_selected_glyph.py --input INPUT --string STRING</code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li><code>--input</code> 要處理的字體專案目錄。</li>



<li><code>--string</code> 要取出的字串。</li>



<li><code>--check_only</code> 不實際刪除檔案。</li>



<li><code>--check_alt</code> 檢查 alt 欄位。</li>
</ul>



<p><strong>操作範例：</strong></p>



<pre class="wp-block-code"><code><meta charset="utf-8">delete_selected_glyph.py --input source.sfdir --string 每一天</code></pre>



<p>使用範例：從 source.sfdir 刪除 「每一天」3個字的 .glyph 檔案。</p>



<p>說明: 上面的範例, 只能針對 .sfdir 的資料夾做處理.</p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">相關文章：</h2>



<p>透過指令「字體」與「FontForge專案」互轉<br><a href="https://codereview.max-everyday.com/font-to-fontforge/">https://codereview.max-everyday.com/font-to-fontforge/</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>實體手寫圖檔轉成字型檔</title>
		<link>https://codereview.max-everyday.com/handwriting-to-font/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Fri, 30 Jul 2021 22:01:51 +0000</pubDate>
				<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1480</guid>

					<description><![CDATA[實體手寫的圖形檔案轉成字型檔案，這個功能已經 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>實體手寫的圖形檔案轉成字型檔案，這個功能已經有網站提供這樣子的服務，例如守寫字(<a href="https://www.writes.com.tw/">https://www.writes.com.tw/</a>)，如果自己想做出類似的功能，要怎麼完成呢？透過下面的6個步驟就可以完成了：</p>



<ul class="wp-block-list"><li>Step 1: 先取得文字輪廓電子檔</li><li>Step 2: 圖片轉灰階</li><li>Step 3: 調整對比（二極化）</li><li>Step 4: 使用模糊讓線條平滑（建議略過）</li><li>Step 5: 使用畫畫工具填入白色與黑色</li><li>Step 6: 匯入圖片到字型檔</li></ul>



<p>可以參考Max提供的相關腳本，應該也可以做出「類似」守寫字網站的效果，在沒有人工處理情況下，自動轉換取得的文字圖片為字體檔。為什麼是類似？因為在圖像處理時，針對線條平滑的處理，超乎想像的難&#8230;，用人工在FontForge裡調整會簡單些。</p>



<hr class="wp-block-separator"/>



<p>大致上的做法與這篇教學類似：<br>以描摹方式建立或更新字型<br><a href="https://codereview.max-everyday.com/create-new-font-by-draw/">https://codereview.max-everyday.com/create-new-font-by-draw/</a></p>



<p>差別在輸入的文字的輪廓資料是從實際可以觸摸的紙與筆來，所以會多一個類比轉數位的動作，如果家裡有掃描器的話，取得的資料比較不會有失真（或變形）的問題，如果是自己用手機相機拍攝的電子檔，會因為距離遠近，造成線條些許的誤差。</p>



<p>類比的輪廓要轉數位，一定會遇到消除鋸齒的平滑處理，如果想透過程式自動完成，可以參考看看這一篇：<br>opencv python 影像模糊與反鋸齒處理<br><a href="https://stackoverflow.max-everyday.com/2021/07/opencv-python-image-blur-anti-aliasing/">https://stackoverflow.max-everyday.com/2021/07/opencv-python-image-blur-anti-aliasing/</a></p>



<p>這次我們是要使用手工的處理，可以先參考看看這一篇：<br>小圖放大有鋸齒馬賽克，三步快速變清晰<br><a href="https://krita.max-everyday.com/3-steps-anti-aliasing/">https://krita.max-everyday.com/3-steps-anti-aliasing/</a></p>



<hr class="wp-block-separator"/>



<p>有一天，看到清松手寫的作者，貼了一張照片在社團，分享他的處理流程：<br><a href="https://www.facebook.com/groups/549661292148791/posts/1257526298028950/">https://www.facebook.com/groups/549661292148791/posts/1257526298028950/</a></p>



<p>類比世界的手寫的經掃描器後變成電子檔的原圖：</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="588" height="588" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n.jpg" alt="" class="wp-image-1482" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n.jpg?v=1627673980 588w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n-300x300.jpg?v=1627673980 300w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n-150x150.jpg?v=1627673980 150w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n-230x230.jpg?v=1627673980 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n-350x350.jpg?v=1627673980 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n-480x480.jpg?v=1627673980 480w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n-50x50.jpg?v=1627673980 50w" sizes="(max-width: 588px) 100vw, 588px" /></figure>



<p>作者透過守寫字網站的處理，再手工地調整的成品：</p>



<figure class="wp-block-image size-full"><img decoding="async" width="673" height="727" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/226507788_4517345698289701_2778555398747304331_n.jpg" alt="" class="wp-image-1483" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/226507788_4517345698289701_2778555398747304331_n.jpg?v=1627674122 673w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226507788_4517345698289701_2778555398747304331_n-230x248.jpg?v=1627674122 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226507788_4517345698289701_2778555398747304331_n-350x378.jpg?v=1627674122 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226507788_4517345698289701_2778555398747304331_n-480x519.jpg?v=1627674122 480w" sizes="(max-width: 673px) 100vw, 673px" /></figure>



<hr class="wp-block-separator"/>



<h2 class="wp-block-heading">如果不透過守寫字，要怎麼來完成？</h2>



<h3 class="wp-block-heading">Step 1: 先取得文字輪廓電子檔</h3>



<p>這個可以使用手機的相機，或掃描器，我們直接使用原作者提供的電子檔，再使用繪圖軟體去除外框。</p>



<p> 附註：建議圖片的大小與字體檔裡字體的 Em Size 一致，常見的值是 1024 或  1000.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="771" height="847" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.28.52-AM.jpg" alt="" class="wp-image-1484" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.28.52-AM.jpg?v=1627674455 771w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.28.52-AM-230x253.jpg?v=1627674455 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.28.52-AM-350x385.jpg?v=1627674455 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.28.52-AM-480x527.jpg?v=1627674455 480w" sizes="(max-width: 771px) 100vw, 771px" /></figure>



<h3 class="wp-block-heading">Step 2: 圖片轉灰階</h3>



<p>因為字體檔是只有黑與白，彩色是用不到的，處理前先轉灰階，如果你是使用 krita, 點上方menu 裡的 image &#8211; Convert Image Color Space&#8230; 就可以把 RGB/Alpha 轉灰階 Grayscale/Alpha.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="763" height="844" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.29.16-AM.jpg" alt="" class="wp-image-1485" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.29.16-AM.jpg?v=1627674685 763w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.29.16-AM-230x254.jpg?v=1627674685 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.29.16-AM-350x387.jpg?v=1627674685 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.29.16-AM-480x531.jpg?v=1627674685 480w" sizes="(max-width: 763px) 100vw, 763px" /></figure>



<h3 class="wp-block-heading">Step 3: 調整對比（二極化）</h3>



<p>透過這一個步驟選擇一個較偏好的二極化的數值，這個是透過去調整亮度與對比值，幾乎所有的影像處理軟體都有這樣的功能，這個功能可以有效去除顏色較淺的雜訊。</p>



<p>不知道如何設定的話，就設在正中間。愈向左線條會較細，愈向右線條較粗。</p>



<p>與守寫字網站相比，自己手工去處理，可以微調的地方會較多，相對也會比較花時間，可以產出的作品有機會比守寫字網站佳。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1833" height="630" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side.jpg?v=1627675016" alt="" class="wp-image-1486" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side.jpg?v=1627675016 1833w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side-1536x528.jpg?v=1627675016 1536w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side-830x285.jpg?v=1627675016 830w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side-230x79.jpg?v=1627675016 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side-350x120.jpg?v=1627675016 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side-480x165.jpg?v=1627675016 480w" sizes="(max-width: 1833px) 100vw, 1833px" /></figure>



<h3 class="wp-block-heading">Step 4: 使用模糊讓線條平滑（建議略過）</h3>



<p>透過模糊(Blur)與調整對比，就可以讓線條或輪廓較平滑。</p>



<p>Max建議是不要做，原因：</p>



<ul class="wp-block-list"><li>1:這一個步驟是可以讓線條平滑沒錯，相對也失去了細節，讓筆畫交叉的地方產生暈染的效果。<meta charset="utf-8"></li><li>2:使用繪圖軟體的線條工具(Line Tool)或貝茲曲線工具(Bezier Curve Tool)把線條變也行。</li><li>3:最後在字體編輯工具裡，也可以很容易讓線條平滑。</li></ul>



<p>如果要套用這一個效果，建議模糊程度低於 5.0px 也許會較好。這個沒有絕對，有些字體增加了暈染效果也滿漂亮的，略有詩意。</p>



<p>附註：也可以使用選取工具(Selection Tool) 先全選之後，反向選取不套用效果的區塊，例筆筆畫相交的時，這樣也可以避開暈染的問題。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1994" height="630" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side.jpg?v=1627675740" alt="" class="wp-image-1488" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side.jpg?v=1627675740 1994w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side-1536x485.jpg?v=1627675740 1536w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side-830x262.jpg?v=1627675740 830w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side-230x73.jpg?v=1627675740 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side-350x111.jpg?v=1627675740 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side-480x152.jpg?v=1627675740 480w" sizes="(max-width: 1994px) 100vw, 1994px" /></figure>



<h3 class="wp-block-heading">Step 5: 使用畫畫工具填入白色與黑色</h3>



<p>類比世界的筆的墨在筆尖輸出時，沒辦法在不同情況下都持續產出相同墨水，因此有幾個特色：</p>



<ul class="wp-block-list"><li>同一筆畫，有時下筆的開頭的顏色較淺，在調高對比值(二極化)之後，預期應該保留的筆畫就消失了。</li><li>同一筆畫，移動速度較快時，線條二側顏色較淺，在調高對比值(二極化)之後，預期應該保留的筆寬就消失了。</li></ul>



<p>對於被消失的區域，希望未來的字體該區域是有顏色的，我們就手動用畫畫工具畫上去，就行了。</p>



<p>例如：希望線條分開，就畫上白色線條</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="912" height="958" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.57.37-AM-2-line-tool.jpg" alt="" class="wp-image-1489" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.57.37-AM-2-line-tool.jpg?v=1627677531 912w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.57.37-AM-2-line-tool-830x872.jpg?v=1627677531 830w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.57.37-AM-2-line-tool-230x242.jpg?v=1627677531 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.57.37-AM-2-line-tool-350x368.jpg?v=1627677531 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.57.37-AM-2-line-tool-480x504.jpg?v=1627677531 480w" sizes="(max-width: 912px) 100vw, 912px" /></figure>



<p>鋸齒狀的地方，在波段平均值以下畫上黑色，波浪上方畫上白色線條。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="954" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.03.22-AM-2-1024x954.jpg?v=1627677799" alt="" class="wp-image-1490"/></figure>



<p>附註：不用做的很完美，因為待會在字體軟體會再做一次。</p>



<p>最後，另存檔案為 bmp 格式 。把有字的圖片依照該字命名，例如：聿.bmp</p>



<h3 class="wp-block-heading"><meta charset="utf-8">Step 6: 匯入圖片到字型檔</h3>



<p>6.1: .bmp (點陣圖) 轉 .svg (向量圖)</p>



<p>可以服用指令：</p>



<pre class="wp-block-preformatted">potrace -b svg -u 50 聿.bmp</pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="647" height="107" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.12.14-AM.jpg" alt="" class="wp-image-1491" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.12.14-AM.jpg?v=1627678411 647w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.12.14-AM-640x107.jpg?v=1627678411 640w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.12.14-AM-230x38.jpg?v=1627678411 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.12.14-AM-350x58.jpg?v=1627678411 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.12.14-AM-480x79.jpg?v=1627678411 480w" sizes="(max-width: 647px) 100vw, 647px" /></figure>



<p>這時就會產生 聿.svg</p>



<p>6.2: 增加空白的字到字體檔</p>



<p>服用指令：</p>



<pre class="wp-block-preformatted">new_glyph.py --output jason5.sfdir --string 聿 --width 1024</pre>



<p>詳細用法，參考：<br><a href="https://codereview.max-everyday.com/new-glyph/">https://codereview.max-everyday.com/new-glyph/</a></p>



<p>6.3: 向量檔匯入字體檔</p>



<p>可以服用指令：</p>



<pre class="wp-block-preformatted">import_svg.py --input jason5.sfdir --svg_path . --filename_pattern="%s.svg"
<meta charset="utf-8"></pre>



<p>詳細用法，參考：<br><a href="https://codereview.max-everyday.com/import-svg-to-font/">https://codereview.max-everyday.com/import-svg-to-font/</a></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="648" height="397" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.13.52-AM.jpg" alt="" class="wp-image-1503" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.13.52-AM.jpg?v=1627681065 648w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.13.52-AM-230x141.jpg?v=1627681065 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.13.52-AM-350x214.jpg?v=1627681065 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.13.52-AM-480x294.jpg?v=1627681065 480w" sizes="(max-width: 648px) 100vw, 648px" /></figure>



<p>說明：可以看到 聿.svg 已成功匯入到字體檔。</p>



<p>第一個版本的字體，效果就滿好的：</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="749" height="704" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.15.07-AM.jpg" alt="" class="wp-image-1504" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.15.07-AM.jpg?v=1627681234 749w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.15.07-AM-230x216.jpg?v=1627681234 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.15.07-AM-350x329.jpg?v=1627681234 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.15.07-AM-480x451.jpg?v=1627681234 480w" sizes="(max-width: 749px) 100vw, 749px" /></figure>



<h3 class="wp-block-heading">Step 7: 在FontForge裡合併節點</h3>



<p>點陣圖在轉向量圖時，針對曲線的判斷較弱，大多是很多細小的直線。</p>



<ul class="wp-block-list"><li>我們先選取 1/4 個圓後，按下 Cmd+M 鍵做節點的合併，就會變成漂亮的曲線。如果遇到合併變成直線，請先按 Cmd + Z 復原，再選取較少，或只選一個節點，進行合併，也會變漂亮曲線。</li><li>有時連續的直線，卻是很多短的線組成，也是選取後，按 Cmd+M 合併即可。</li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="630" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.26.35-AM-side-1024x630.jpg?v=1627681386" alt="" class="wp-image-1505"/></figure>



<p>說明：左圖的右下角選取 1/4 個圓，按下合併後，就會變成右圖。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="537" height="617" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.32.27-AM.jpg" alt="" class="wp-image-1506" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.32.27-AM.jpg?v=1627681805 537w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.32.27-AM-230x264.jpg?v=1627681805 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.32.27-AM-350x402.jpg?v=1627681805 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.32.27-AM-480x552.jpg?v=1627681805 480w" sizes="(max-width: 537px) 100vw, 537px" /></figure>



<p>說明：右上角的2個大曲線，是合併的結果，左圖的鋸齒邊，選取後按Cmd+M 合併就會變平滑。</p>



<p>以上就是全部了，在FontForge 使用匯出功能就可以拿到字體檔了。</p>



<hr class="wp-block-separator"/>



<p>字體檔放到原作者的圖上做對照：</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="588" height="588" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final.jpg" alt="" class="wp-image-1507" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final.jpg?v=1627682088 588w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final-300x300.jpg?v=1627682088 300w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final-150x150.jpg?v=1627682088 150w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final-230x230.jpg?v=1627682088 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final-350x350.jpg?v=1627682088 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final-480x480.jpg?v=1627682088 480w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final-50x50.jpg?v=1627682088 50w" sizes="(max-width: 588px) 100vw, 588px" /></figure>



<p>說明：粉紅色半透明的部份，是這次匯入的作果。</p>



<p>與用守寫字網站，並原作者處理的結果相比較：</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="673" height="727" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-author-fade-transparent.jpg" alt="" class="wp-image-1508" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-author-fade-transparent.jpg?v=1627682218 673w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-author-fade-transparent-230x248.jpg?v=1627682218 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-author-fade-transparent-350x378.jpg?v=1627682218 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-author-fade-transparent-480x519.jpg?v=1627682218 480w" sizes="(max-width: 673px) 100vw, 673px" /></figure>



<p><meta charset="utf-8">說明：<meta charset="utf-8">淺藍色半透明的部份，是這次匯入的作果。</p>



<p>原作者的筆畫平均值會較細，有可能是守寫字網站的自動化處理在對比（二極化）的選擇是使用 127(正中間)，所以比較細一點。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>向量檔匯入字體檔</title>
		<link>https://codereview.max-everyday.com/import-svg-to-font/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Fri, 30 Jul 2021 21:27:35 +0000</pubDate>
				<category><![CDATA[字串處理]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1497</guid>

					<description><![CDATA[想要擁有專屬字型。手寫後轉成 SVG 圖檔。 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>想要擁有專屬字型。手寫後轉成 SVG 圖檔。一個一個手動匯入太慢。這份 Python 腳本可以自動化。它利用 FontForge 引擎處理。</p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">前置作業</h2>



<p>使用前，需要先安裝FontForge。</p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/import_svg.py">https://github.com/max32002/MaxFontScripts/blob/master/import_svg.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用方法</h2>



<pre class="wp-block-code"><code>fontforge import_svg.py -i your-project.sfdir -o your-new-font.ttf --svg_path . </code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li><strong>input</strong>:<code>&nbsp;Font Forge 的 .sfdir 資料夾路徑</code>, 或是字型的檔案, 建議使用 .ttf 當作輸入, 效率會快很多. 但是, 如果遇到一直匯入失敗的情況, 建議改用 .sfdir 的輸入格式.</li>



<li><strong>output</strong>: save a new font forge project name, 預設值是空的, 不輸入即可直接更新到 input font forge project.建議使用 .ttf 當作輸入, 效率會快很多. </li>



<li><strong>filename_pattern</strong>: 檔名的規則, 應該是沒什麼好修改的, 用預設值即可.</li>



<li><strong>filename_rule</strong>: 在檔名規則裡的變數來源，預設值是 char 。這個參數只接受4個值：[&#8216;char&#8217;, &#8216;unicode_hex&#8217;, &#8216;unicode_int&#8217;]，分別是字元，unicode 16進位值，unicode 10進位值. 使用 char 是很方便, 但問題是相容性不好, 也容易出錯, 尤其是擴充字元的部份, 很多作業系統不充許檔名使用, 預設值是使用 unicode_int.</li>



<li><strong>width</strong>: 字形寬度，預設值為 1000, 可以不指定 width 內容, 程式會從 svg_path 中的第一個 .svg 檔讀取其內容來判斷匯入字型的寬度。</li>
</ul>



<p>說明, 由於需要使用到 fontforge library, 所以要透過 fontforge 執行這一個 python script.</p>



<p>圖片檔名要跟字對應。腳本提供三種來源。第一種是直接用字元當檔名。例如 阿.svg。設定為 char 模式。第二種是 Unicode 十進位。例如 38463.svg。設定為 unicode_int。第三種是十六進位。例如 963f.svg。設定為 unicode_hex。</p>



<p>在操作大型的字型檔時, 往往需要很高的記憶體, 一但記憶體不足, fontforge 就會crash. Window 平台上新的版本的 fontforge 是 32 位元版本, 因為 macOS / Linux 長期都是 64位元, 反而在 macOS / Linux 可以順利地直接處理大型的字型檔.</p>



<p>實際測試在 Windows 32位元版本, 當程式內部使用的記憶體超過 2.1GB 的 RAM, fontforge 程式就會閃退 crash, 針對會需要處理大型的字型檔, 請改安裝 64位元版本, fontforge x64下載用傳送門:<br><a href="https://sourceforge.net/projects/fontforgebuilds/files/x86_64/Portable/">https://sourceforge.net/projects/fontforgebuilds/files/x86_64/Portable/</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">錯誤排除</h2>



<p><strong>執行指令:</strong></p>



<pre class="wp-block-code"><code>fontforge import_svg.py --input OldMaruko2CJKjp-Regular.ttf --output OldMaruko3CJKjp-Regular.ttf --svg_path my-svg-folder --begin 8000 --end 9000</code></pre>



<p></p>



<p><strong>回傳錯誤:</strong></p>



<pre class="wp-block-preformatted">Open font: OldMaruko2CJKjp-Regular.ttf<br>Save dir: OldMaruko3CJKjp-Regular.ttf<br>Svg path: my-svg-folder<br>Filename pattern: %s.svg<br><br>Source font total glyph: 44922<br>Processing glyph: 8000<br>Processing glyph: 9000<br>Imported count: 1001<br>Attempt to output -43598 into a 16-bit field. It will be truncated and the file may not be useful.</pre>



<p>說明, 使用輸入 .ttf 載入速度快, 改成 .sfdir 為輸入格式, 除了載入字型的輸入變極慢之外, 結果匯入  svg 之後, 還是一樣出錯, 這似乎可能是字型檔案出錯.</p>



<p>要知道是字型檔案出錯, 只要使用另存字型檔的功能, 就可以知道字型檔是不是壞掉, 參考:<br><a href="https://codereview.max-everyday.com/font-to-fontforge/">https://codereview.max-everyday.com/font-to-fontforge/</a></p>



<p><strong>fontforge 上的討論:</strong><br>Lookup removal related &#8220;Attempt to output n into a 16-bit field.&#8221; failure<br><a href="https://github.com/fontforge/fontforge/issues/5228">https://github.com/fontforge/fontforge/issues/5228</a></p>



<p>如果是匯入的svg 造成字型檔損壞, 只要調整匯入的範圍即可知道.</p>



<p>解法是讓來源的字型檔變正常, 參考看看:<br><a href="https://stackoverflow.max-everyday.com/2022/09/fontforge-font-pros-settings-wrong/">https://stackoverflow.max-everyday.com/2022/09/fontforge-font-pros-settings-wrong/</a></p>



<p><strong>結論:</strong></p>



<ul class="wp-block-list">
<li>使用 .sfdir 或 .ttf 在匯入的時候, 都要先直接用另存 .ttf 的功能來測試輸入用的字型專案或.ttf 檔是否能正常存檔.</li>



<li>雖然上面有錯誤訊息, 但實際上字型檔一切功能都正常, 只是 warning 訊息, &#8220;may not be useful&#8221; 是可以能會發生, 實際上很高機率還可以繼續使用.</li>
</ul>



<p><strong>常見問題與提醒:</strong></p>



<p>可以直接在指令修改字體名字。familyname 是系列名稱。fontname 是系統內部識別名。width 可以調整字元寬度。預設值通常是 1000。如果圖片不需要自動縮放。不要加上 enable_scale 參數。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">簡化 svg 檔</h2>



<ul class="wp-block-list">
<li>Scour<br><a href="https://github.com/scour-project/scour">https://github.com/scour-project/scour</a></li>



<li>picosvg<br><a href="https://github.com/googlefonts/picosvg">https://github.com/googlefonts/picosvg</a></li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">相關文章</h2>



<ul class="wp-block-list">
<li>增加空白文字到字體檔<br><meta charset="utf-8"><a href="https://codereview.max-everyday.com/new-glyph/">https://codereview.max-everyday.com/new-glyph/</a></li>



<li>以描摹方式建立或更新字型<br><a href="https://codereview.max-everyday.com/create-new-font-by-draw/">https://codereview.max-everyday.com/create-new-font-by-draw/</a></li>



<li>dumping SVG outlines into a FontForge file<br><a href="https://stackoverflow.max-everyday.com/2021/06/dumping-svg-outlines-into-a-fontforge-file/">https://stackoverflow.max-everyday.com/2021/06/dumping-svg-outlines-into-a-fontforge-file/</a></li>
</ul>



<p></p>



<p></p>



<p></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>增加空白文字到字體檔</title>
		<link>https://codereview.max-everyday.com/new-glyph/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Fri, 30 Jul 2021 21:07:19 +0000</pubDate>
				<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1493</guid>

					<description><![CDATA[為什麼要學這個？ 在字體的專案檔裡某一個文字 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>在字體的專案檔裡某一個文字「沒有定義」與「有定義，內容是空白」是有很大的區別。有時候，要先字體檔案事先定義，會比較好做事。</p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">前置作業</h2>



<p>使用前，需要先安裝FontForge，把要處理的字體先存成.sfdir 的資料夾格式。</p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/new_glyph.py">https://github.com/max32002/MaxFontScripts/blob/master/new_glyph.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用方法</h2>



<pre class="wp-block-code"><code>new_glyph.py --output your-project.sfdir --string 要產生的文字清單 --width 文字寬度</code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li><strong>output</strong>:<code> Font Forge 的 .sfdir 資料夾路徑。</code></li>



<li><strong>string</strong>: 要產生的文字清單，可以多個字</li>



<li><strong>width</strong>: 寬度，不輸入時，預設值為 1024. </li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">相關文章：</h2>



<p>從字體專案裡取得特定文字<br><a href="https://codereview.max-everyday.com/get-selected-glyph-from-font/">https://codereview.max-everyday.com/get-selected-glyph-from-font/</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>取得字體的包含文字</title>
		<link>https://codereview.max-everyday.com/get-font-chars/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Thu, 20 Aug 2020 15:25:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[String]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1381</guid>

					<description><![CDATA[為什麼要學這個？ 可以知道某個字體檔定義了那 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-1024x1024.jpg?v=1597937059" alt="" class="wp-image-1384" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-1024x1024.jpg?v=1597937059 1024w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-300x300.jpg?v=1597937059 300w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-150x150.jpg?v=1597937059 150w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-768x768.jpg?v=1597937059 768w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-640x640.jpg?v=1597937059 640w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-50x50.jpg?v=1597937059 50w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>可以知道某個字體檔定義了那些文字，進行知道缺字是否有缺字，及之後要先補那些字進去。</p>



<p>下面提供2個範例:</p>



<ul class="wp-block-list">
<li>範例1: 取得 fontforge 專案下的文字清單.</li>



<li>範例2: 取得某一個目錄下, 以 unicode 為命名的文字清單.</li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">前置作業</h2>



<p>使用方式有2種:</p>



<ul class="wp-block-list">
<li>用法1: fontforge + python. (比較簡單)</li>



<li>用法2, 需要先安裝FontForge，把要處理的字體先存成.sfdir 的資料夾格式, 執行時單純地執行 python。</li>
</ul>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/get_ttf_chars.py">https://github.com/max32002/MaxFontScripts/blob/master/get_ttf_chars.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用方法</h2>



<p>同一個 python script, 有二種使用方法, 建議使用第一種, 在 fontforge 模式下.</p>



<p><strong>有</strong> fontforget 指令模式: <strong>(建議使用, 較有效率)</strong></p>



<pre class="wp-block-code"><code>fontforge get_ttf_chars.py font_forge.sfdir --output charset.txt</code></pre>



<p><strong>無</strong> fontforget 指令模式:</p>



<pre class="wp-block-code"><code>get_ttf_chars.py font_forge.sfdir --output charset.txt</code></pre>



<p></p>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li><code>&lt;輸入目錄&gt;</code> 參數，Font Forge 的 .sfdir 資料夾路徑。.sfdir 可以省略, 程式會自動增加, 輪入必需是一個已存在的 font forget project 目錄.</li>



<li><code>--output</code> 參數，用於輸出的文字檔.</li>



<li><code>--mode</code> 參數，預設值是 &#8220;fontforge&#8221;, 針對 fontforge 的專案檔做處理, 使用參數 &#8211;mode=unicode_image 可以取得使用 unicode 編碼的數字的圖片.</li>
</ul>



<p></p>



<p><strong>操作範例1：取得字型檔案(.ttf)的文字清單.</strong> (建議使用)</p>



<pre class="wp-block-code"><code>fontforget get_ttf_chars.py source.sfdir</code></pre>



<p></p>



<p><strong>操作範例2：取得 fontforge 專案(.sfdir)下的文字清單.</strong></p>



<pre class="wp-block-code"><code>get_ttf_chars.py source.sfdir</code></pre>



<p>使用範例：由於沒有指定輸出的文字檔, 預設會產生 source.txt 文字檔，裡面記錄 source.sfdir 有定義的文字。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><strong>操作範例3：取得某一個目錄下, 以 unicode 為命名的文字清單.</strong></p>



<pre class="wp-block-code"><code>get_ttf_chars.py sp --mode=unicode_image</code></pre>



<p>執行結果:</p>



<pre class="wp-block-preformatted">input: sp<br>output: charset_sp.txt<br>charset length: 73</pre>



<p>結果說明: 輸入資料夾名稱: sp, 輸出檔名 charset_sp.txt, 內容長度: 73個字.</p>



<p>指定 &#8211;mode, 不是很直覺, 請改用下面的 script:</p>



<ul class="wp-block-list">
<li>取得字體的包含文字<br><a href="https://codereview.max-everyday.com/get-font-chars/">https://codereview.max-everyday.com/get-font-chars/</a></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">字型與圖像字符集提取工具使用教學</h2>



<p>這個小工具可以幫你從字型檔案（.otf、.ttf、.woff、.woff2、.sfdir）或是圖像資料夾中，提取出裡面包含的字符集，並輸出成一個文字檔。對於想要了解字型包含哪些字，或是從圖像建立字符集的人來說，非常方便！</p>



<h3 class="wp-block-heading">使用前準備</h3>



<ol class="wp-block-list">
<li><strong>安裝 Python：</strong>如果你的電腦還沒有安裝 Python，請先到 <a href="https://www.python.org/downloads/">Python 官網</a> 下載並安裝。</li>



<li><strong>安裝 fontforge（如果需要處理字型檔案）：</strong>如果你需要處理字型檔案，你需要安裝 fontforge 這個工具。安裝方式會根據你的作業系統有所不同，請參考 <a href="https://fontforge.org/en-US/downloads/">fontforge 官網</a> 的說明。</li>



<li><strong>安裝 LibGlyph（如果需要處理 .sfdir 檔案）：</strong>如果你需要處理 .sfdir 檔案，你需要安裝 LibGlyph 這個函式庫。你可以使用 pip 來安裝： <code>pip install LibGlyph</code></li>



<li><strong>準備字型檔案或圖像資料夾：</strong>把你想要處理的字型檔案或圖像資料夾放在一個方便存取的位置。</li>
</ol>



<h3 class="wp-block-heading">使用方式</h3>



<ol class="wp-block-list">
<li><strong>下載腳本：</strong>把上面的 Python 腳本複製下來，儲存成一個 .py 檔案，例如 <code>get_ttf_chars.py</code>。</li>



<li><strong>開啟終端機或命令提示字元：</strong>在你的作業系統中開啟終端機（macOS/Linux）或命令提示字元（Windows）。</li>



<li><strong>執行腳本：</strong>使用以下指令來執行腳本，並替換成你自己的檔案路徑和選項： <br><code>python get_ttf_chars.py &lt;輸入檔案或資料夾路徑&gt; --output [輸出文字檔路徑] --mode [模式]</code>
<ul class="wp-block-list">
<li><code><code>&lt;輸入檔案或資料夾路徑&gt;</code></code>：指定輸入的字型檔案或圖像資料夾路徑。</li>



<li><code>--output</code>：指定輸出的文字檔路徑，預設是 <code>output.txt</code>。</li>



<li><code>--mode</code>：指定模式，有兩種模式可以選擇：
<ul class="wp-block-list">
<li><code>fontforge</code>：處理字型檔案（.otf、.ttf、.woff、.woff2、.sfdir）。</li>



<li><code>unicode_image</code>：處理圖像資料夾，圖像檔名必須是 Unicode 編碼的數字。</li>
</ul>
</li>
</ul>
</li>



<li><strong>範例：</strong>
<ul class="wp-block-list">
<li>處理字型檔案： <br><code>python get_ttf_chars.py myfont.ttf --output mycharset.txt --mode fontforge</code></li>



<li>處理圖像資料夾： <br><code>python get_ttf_chars.py images --output image_charset.txt --mode unicode_image</code></li>
</ul>
</li>



<li><strong>查看輸出結果：</strong>執行完成後，會在指定的路徑產生一個文字檔，裡面包含了提取出來的字符集。</li>
</ol>



<h3 class="wp-block-heading">注意事項</h3>



<ul class="wp-block-list">
<li>圖像資料夾中的圖像檔名必須是 Unicode 編碼的數字，例如 <code>65</code>.png 代表字元 &#8216;A&#8217;。</li>



<li>如果處理字型檔案時遇到問題，請確認 fontforge 是否正確安裝。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">進階應用</h2>



<p>字型A (例如: zen maru) 使用的異體字清單如下:</p>



<pre class="wp-block-preformatted">不串丹什來例便僚兀兩凉列利刺力勉勒勤卑句吏呂喇墨壘尿年弄律懶拓易暈暴更林櫓沈洛洞淋濫烈珞理略異碑磊行裏見豈賂賈路車輻郞里量閭阮隆隷駱魯鷺</pre>



<p>字型B (例如: noto sans)  也使用了相同形狀但編碼不同的異體字:</p>



<pre class="wp-block-preformatted">兀勉勤卑墨碑隆豈更車賈串句喇懶洛珞駱濫來櫓路魯鷺弄磊賂壘勒丹異便不沈略兩量呂閭力年列烈例僚尿暈阮律利吏易理裏里林淋什刺拓洞暴輻行見</pre>



<p>要如何在2個字型, 分別完成對映? 解法是在呼叫 get_ttf_chars.py 增加參數 &#8211;altuni 與 &#8211;find_alt_text=text</p>



<p>範例: </p>



<pre class="wp-block-code"><code>fontforge get_ttf_chars.py notosans.ttf --output alt_root.txt --altuni --find_alt_text=不串丹什來例便僚兀兩凉列利刺力勉勒勤卑句吏呂喇墨壘尿年弄律懶拓易暈暴更林櫓沈洛洞淋濫烈珞理略異碑磊行裏見豈賂賈路車輻郞里量閭阮隆隷駱魯鷺</code></pre>



<p>這樣就可以取得 notosans 的真正 glyph 本體.</p>



<p>同時附上 mapping 表:</p>



<p>redirect_dict = {19981: 63847, 20018: 63749, 20025: 63838, 20160: 63997, 20358: 63789, 20363: 63925, 20415: 63845, 20698: 63931, 20800: 20800, 20841: 63864, 21015: 63900, 21033: 63965, 21050: 63999, 21147: 63882, 21193: 21193, 21202: 63826, 21220: 21220, 21329: 21329, 21477: 63750, 21519: 63966, 21570: 63872, 21895: 63755, 22696: 22696, 22744: 63818, 23615: 63933, 24180: 63886, 24324: 63811, 24459: 63960, 25078: 63757, 25299: 64002, 26131: 63968, 26248: 63941, 26292: 64006, 26356: 63745, 26519: 63988, 27347: 63793, 27784: 63858, 27931: 63765, 27934: 64005, 28107: 63989, 28651: 63778, 28872: 63903, 29662: 63767, 29702: 63972, 30053: 63862, 30064: 63842, 30865: 30865, 30922: 63815, 34892: 64008, 35023: 63975, 35211: 64010, 35912: 63744, 36034: 63816, 36040: 63747, 36335: 63799, 36554: 63746, 36667: 64007, 37324: 63977, 37327: 63870, 38317: 63878, 38446: 63942, 38534: 38534, 39409: 63770, 39791: 63801, 40442: 63802}</p>



<p>把 mapping 表放在 export_ttf_to_svg.py 內, 就可以讓 zen maru 所匯出的 .svg 可以讓 notosan 直接做匯入.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">接續應用</h2>



<p>有了清單之後, 就是需要去清單做交集或刪除的過濾.</p>



<ul class="wp-block-list">
<li>從文字檔移除特定文字集合<br><a href="https://codereview.max-everyday.com/remove-selected-char/">https://codereview.max-everyday.com/remove-selected-char/</a></li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">相關文章：</h2>



<ul class="wp-block-list">
<li>從字體專案裡取得特定文字glyph<br><a href="https://codereview.max-everyday.com/get-selected-glyph-from-font/">https://codereview.max-everyday.com/get-selected-glyph-from-font/</a></li>



<li>從文字檔移除特定文字集合<br><a href="https://codereview.max-everyday.com/remove-selected-char/">https://codereview.max-everyday.com/remove-selected-char/</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>搬移檔案到子資料夾：解決檔案數量太多問題</title>
		<link>https://codereview.max-everyday.com/batch-make-dir/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Tue, 18 Aug 2020 10:31:26 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[字串處理]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[String]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1351</guid>

					<description><![CDATA[為什麼要學這個？ 如果遇到某一個資料夾裡的檔 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-1024x1024.png?v=1597746659" alt="" class="wp-image-1364" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir.png?v=1597746659 1024w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-300x300.png?v=1597746659 300w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-150x150.png?v=1597746659 150w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-768x768.png?v=1597746659 768w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-640x640.png?v=1597746659 640w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-830x830.png?v=1597746659 830w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-230x230.png?v=1597746659 230w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-350x350.png?v=1597746659 350w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-480x480.png?v=1597746659 480w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-50x50.png?v=1597746659 50w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>如果遇到某一個資料夾裡的檔案數量太多，造成處理的效能不佳，幫資料夾的檔案數量瘦身，以增加處理的效率。</p>



<p>這個使用批次檔（或shell script）腳本程式來處理，一定比使用人工去選取和搬移快很多。</p>



<p>類似的應用像是自動<a href="https://github.com/max32002/MaxFontScripts/blob/master/batch_sync_git_readme.py">幫特定的資料夾自動更新部份內容</a>後，再<a href="https://github.com/max32002/MaxFontScripts/blob/master/batch_git_push.py">幫資料夾上傳內容到github 上</a>。 很多人工手動的操作，應該都可以換成使用自動化的腳本來完成，減少人工重覆去操作的這個行為。當然，要處理的事情的數量少，而重覆機率低，使用純手工去做，可能會方便點。</p>



<p>類似且重覆性質的工作，交給程式來做，人類比較不會覺得無聊。</p>



<hr class="wp-block-separator"/>



<h2 class="wp-block-heading">前置作業</h2>



<p>範例程式碼下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/batch_make_dirs.py">https://github.com/max32002/MaxFontScripts/blob/master/batch_make_dirs.py</a></p>



<hr class="wp-block-separator"/>



<h2 class="wp-block-heading">使用方法</h2>



<p><strong>Step 1：</strong>先使用 grep 或  ls 指令，取得要處理的目錄清單。</p>



<p><strong>Step 2：</strong>組合要進去每一個目錄後，要執行的指令有那些。</p>



<p><strong>Step 3：</strong>執行 python script 並轉向輸出到 run.sh (或Windows 平台的批次檔)</p>



<p><strong>Step 4：</strong>執行產生出來的 run.sh。</p>



<hr class="wp-block-separator"/>



<p>因應瘦身，所以原本直接產生到該目錄下的匯出程式也要跟著調整，針對第1個字元，多往下產生到子資料夾：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/bmp.py">https://github.com/max32002/MaxFontScripts/blob/master/bmp.py</a></p>



<p>因應瘦身，所以原本要讀取的程式，也要跟著調整多往下一個子資料夾來取得檔案。</p>



<hr class="wp-block-separator"/>



<h2 class="wp-block-heading">Code Review 影片</h2>



<p>搬移檔案到子資料夾：解決檔案的數量太多問題<br></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>從其他檔案置換區塊內容</title>
		<link>https://codereview.max-everyday.com/update-block-from-file/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Mon, 10 Aug 2020 15:09:38 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[字串處理]]></category>
		<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[String]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1265</guid>

					<description><![CDATA[為什麼要學這個？ 如果透過指令或程式來做會更 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-1024x1024.png?v=1597670288" alt="" class="wp-image-1336" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text.png?v=1597670288 1024w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-300x300.png?v=1597670288 300w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-150x150.png?v=1597670288 150w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-768x768.png?v=1597670288 768w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-640x640.png?v=1597670288 640w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-830x830.png?v=1597670288 830w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-230x230.png?v=1597670288 230w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-350x350.png?v=1597670288 350w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-480x480.png?v=1597670288 480w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-50x50.png?v=1597670288 50w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>如果透過指令或程式來做會更有效率的話，當然要使用指令來做。這篇文章主要在講文字檔裡的字串處理。</p>



<p>如果有想透過程式來合併文字檔的內容，可以試看看文章裡附的小程式。</p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">前置作業</h2>



<p>程式碼下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/update_block_from_file.py">https://github.com/max32002/MaxFontScripts/blob/master/update_block_from_file.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用方法</h2>



<pre class="wp-block-code"><code>update_block_from_file.py --first FIRST --second SECOND --begin BEGIN --resume RESUME</code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li>&#8211;first 第一個檔案路徑，內容會被修改。</li>



<li>&#8211;second 第二個檔案路徑，內容會被複製。</li>



<li>&#8211;begin 第一個檔案跳脫不處理，第二個檔案開始複製的字串。</li>



<li>&#8211;resume 第二個檔案跳脫不處理，並且第一個檔案接續輸出的字串。</li>
</ul>



<p>改良前的前身：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/update_lang_props.py">https://github.com/max32002/MaxFontScripts/blob/master/update_lang_props.py</a></p>



<p>前身的前世：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/copy_kerning_props.py">https://github.com/max32002/MaxFontScripts/blob/master/copy_kerning_props.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用範例2號</h2>



<p>遇到的問題是，想要同步 github 的多個 project 裡的  README.md 檔案裡的「相關網址」的區塊。</p>



<h3 class="wp-block-heading">使用步驟：</h3>



<p><strong>Step 1：</strong>先修改出一個標準版，要讓其他專案做「共用」，修改後放到一個指定路徑。例如：~/Documents/sh/fix_font_readme_urls/README.md</p>



<p><strong>Step 2：</strong>使用 find . 指令，列出有 README.md 的專案，或使用 ls 手動整理目錄的清單。</p>



<p><strong>Step 3：</strong>使用 Step 2 的 List ，產生一個 python 檔案。例如：batch_sync_git_readme.py，檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/batch_sync_git_readme.py">https://github.com/max32002/MaxFontScripts/blob/master/batch_sync_git_readme.py</a></p>



<p>這個程式的主程式，是去使用上面寫的 python, 主程式如下：</p>



<pre class="wp-block-code"><code>begin_string = "## 相關網頁"
resume_string = "https://max-everyday.com/about/#donate"
cmd = "~/Documents/sh/update_block_from_file.py --first \"%sREADME.md\"" % (item.replace("\"","\\""))
cmd += " --second \"%s\"" % (reuse_file.replace("\"","\\""))
cmd += " --begin \"%s\"" % (begin_string.replace("\"","\\""))
cmd += " --resume \"%s\"" % (resume_string.replace("\"","\\""))
print(cmd)</code></pre>



<p><strong>Step 4：</strong>執行 batch_sync_git_readme.py &gt; run.sh 取得批次置換的指令在 run.sh 裡。</p>



<p><strong>Step 5：</strong>先手動執行 run.sh 裡的某一行，並檢查置換結果是否如預期。如果結果是對的，就執行 run.sh 讓其他的資料夾都置換成「共用區塊」後的版本。</p>



<p><strong>Step 6：</strong>執行批次git add/commit/push 指令。例如：batch_git_push.py，檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/batch_git_push.py">https://github.com/max32002/MaxFontScripts/blob/master/batch_git_push.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用範例3號</h2>



<p><strong>情境：</strong></p>



<p>有多個目錄 ex: /convert/, /convert_b2/ , /convert_xd/ 每個目錄下都有 TtfConfig.py, 每個 python 的檔案，在某一行以下，希望與 /convert/ 目錄下的 TtfConfig.py 相同。</p>



<p><strong>使用方法：</strong></p>



<pre class="wp-block-code"><code>~/Documents/sh/update_block_from_file.py --first convert_xd/TtfConfig.py --second convert/TtfConfig.py --begin " STYLE_INDEX = 5"</code></pre>



<p><strong>範例說明：</strong></p>



<p>在 &#8221; STYLE_INDEX = 5&#8243; 這行文字以下，都會使用 second 的，會修改掉 first 指定的檔案。</p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">Code Review 影片</h2>



<p>程式架構優化 &#8211; 從其他檔案置換區塊內容<br><a href="https://youtu.be/q2b1MYMpvUI">https://youtu.be/q2b1MYMpvUI</a></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio wp-embed-aspect-16-9"><div class="wp-block-embed__wrapper">
<iframe title="程式架構優化 - 從其他檔案置換區塊內容" width="1170" height="658" src="https://www.youtube.com/embed/q2b1MYMpvUI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div></figure>



<p>Max優化程式的方法是減少程式碼中寫死的常數，提升程式的彈性來增加使程式更容易重覆利用。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>從字體專案裡取得特定文字glyph</title>
		<link>https://codereview.max-everyday.com/get-selected-glyph-from-font/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Tue, 04 Aug 2020 15:00:26 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Shell]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1276</guid>

					<description><![CDATA[為什麼要學這個？ 比使用人工去取出想更新的文 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1920" height="1280" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2.jpg?v=1597076344" alt="" class="wp-image-1316" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2.jpg?v=1597076344 1920w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2-1536x1024.jpg?v=1597076344 1536w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2-830x553.jpg?v=1597076344 830w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2-230x153.jpg?v=1597076344 230w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2-350x233.jpg?v=1597076344 350w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2-480x320.jpg?v=1597076344 480w" sizes="(max-width: 1920px) 100vw, 1920px" /></figure>



<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>比使用人工去取出想更新的文字有效率。</p>



<p><meta charset="utf-8">與使用「人工」手動去處理相比，用程式去<meta charset="utf-8">取出想更新的文字有效率。</p>



<p>程式的目的是要去取出font forge 專案檔的特定 glyph.</p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">前置作業</h2>



<p>使用前，需要先安裝FontForge，把要處理的字體先存成.sfdir 的資料夾格式。</p>



<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">重要：這個小程式目前無法直接輸入字型檔, 只能處理 <strong>.sfdir</strong> 資料夾。</mark></p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/copy_selected_out.py">https://github.com/max32002/MaxFontScripts/blob/master/copy_selected_out.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用方法</h2>



<pre class="wp-block-code"><code>copy_selected_out.py --input INPUT --string STRING --output OUTPUT</code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li><code>--input</code> 要處理的字體專案目錄。</li>



<li><code>--string</code> 要取出的字串。</li>



<li><code>--output</code> 要輸出的路徑，預設是執行指令的現行目錄下。</li>
</ul>



<p><strong>操作範例：</strong></p>



<pre class="wp-block-code"><code>copy_selected_out.py --input source.sfdir --output target.sfdir --string 每一天</code></pre>



<p>使用範例：從 source.sfdir 取出 「每一天」3個字，存到轉換為 target.sfdir 目錄。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">進階參數說明</h2>



<ul class="wp-block-list">
<li><code>--file</code>&nbsp;目的字串的文字檔。</li>



<li><code>--range</code>&nbsp;目的字元的範圍, 使用16進制, 例如: –range AC00,D7AF</li>



<li><code>--range_int</code>&nbsp;目的字元的範圍, 使用10進制.</li>
</ul>



<p>常見的 range</p>



<ul class="wp-block-list">
<li>2E80 – 2EFF: CJK Radicals Supplement</li>



<li>3400 – 4DBF: 中日韓統一表意文字擴充區A,</li>



<li>4E00 – 9FFF: CJK Unified Ideographs,</li>



<li>AC00 — D7AF: 諺文音節 (Hangul Syllables), Hangul音節是一個Unicode塊，其中包含用於現代韓語的預先編寫的Hangul音節塊。音節可以通過算法直接映射到韓文字母Unicode塊中的兩個或三個字符的序列： U + 1100–U + 1112之一：19個現代韓文字母領先的輔音字母； U + 1161–U + 1175之一：21種現代韓文元音字母；</li>



<li>F900 – FAFF: CJK Compatibility Ideographs</li>



<li>20000 – 2A6DF: 中日韓統一表意文字擴充區B</li>



<li>30000 – 3134F: 中日韓統一表意文字擴展區G</li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">相關文章：</h2>



<ul class="wp-block-list">
<li>透過指令「字體」與「FontForge專案」互轉<br><a href="https://codereview.max-everyday.com/font-to-fontforge/">https://codereview.max-everyday.com/font-to-fontforge/</a></li>



<li>從圖片目錄裡取得特定文字檔案<br><a href="https://codereview.max-everyday.com/copy_selected_image_out/">https://codereview.max-everyday.com/copy_selected_image_out/</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>字型(.ttf) / Web Font (.woff2) / FontForge專案(.sfdir) 互轉</title>
		<link>https://codereview.max-everyday.com/font-to-fontforge/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Sun, 02 Aug 2020 16:25:07 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[Shell]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1241</guid>

					<description><![CDATA[為什麼要學這個？ 透過 FontForge  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>透過 FontForge 開啟，並另存專案為資料夾格式(.sfdir)，除了手動去操作之外，也可以使用腳本來做。如果透過指令來做會更有效率的話，當然要使用指令來做。</p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">實作步驟</h2>



<p>使用前，需要先安裝FontForge，透過執行FontForge的腳本(Script)可以在指令行的模式下，合併2個字體檔案。</p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案，轉成FontForge (all font format to .sfdir)下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/save_as.py">https://github.com/max32002/MaxFontScripts/blob/master/save_as.py</a></p>



<p>Max腳本檔案，轉成字體檔 (all font format to .ttf/.otf/.svg/.woff/.woff2)下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/generate.py">https://github.com/max32002/MaxFontScripts/blob/master/generate.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用範例</h2>



<p>把 source.ttf 轉換為 target.sfdir</p>



<pre class="wp-block-code"><code>fontforge save_as.py -i source.ttf -o target.sfdir</code></pre>



<p>把 source.ttf 轉換為 target.woff2</p>



<pre class="wp-block-code"><code>fontforge generate.py -i source.ttf -o target.woff2</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">檔案說明</h2>



<ul class="wp-block-list">
<li><strong>generate.py</strong><br>讀取字體並匯出為 .ttf / .woff2</li>



<li><strong>save_as.py</strong><br>讀取字體並產成為 fontforge 專案資料夾 .sfdir<br></li>
</ul>



<p></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-1024x1024.png?v=1596385479" alt="" class="wp-image-1246" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-1024x1024.png?v=1596385479 1024w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-300x300.png?v=1596385479 300w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-150x150.png?v=1596385479 150w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-768x768.png?v=1596385479 768w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-640x640.png?v=1596385479 640w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-50x50.png?v=1596385479 50w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">MaxCodeReview 影片</h2>



<p>Youtube：<a href="https://youtu.be/9-0WHjjfOgU">https://youtu.be/9-0WHjjfOgU</a></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="「字體」與「FontForge專案」互轉" width="1170" height="658" src="https://www.youtube.com/embed/9-0WHjjfOgU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">相關文章：</h2>



<ul class="wp-block-list">
<li>轉換字型為webfont<br><a href="https://stackoverflow.max-everyday.com/2020/08/convert-ttf-to-webfont/">https://stackoverflow.max-everyday.com/2020/08/convert-ttf-to-webfont/</a></li>



<li>如何製作「字體預覽」的網頁功能<br><a href="https://codereview.max-everyday.com/webfont-preview-textarea/">https://codereview.max-everyday.com/webfont-preview-textarea/</a></li>
</ul>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>透過指令合併2個字體檔案</title>
		<link>https://codereview.max-everyday.com/merge-font/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Wed, 29 Jul 2020 00:20:11 +0000</pubDate>
				<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[Shell]]></category>
		<guid isPermaLink="false">http://codereview.max-everyday.com/?p=1</guid>

					<description><![CDATA[為什麼要學這個？ 如果透過指令來做會更有效率 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-1024x1024.jpg?v=1597073599" alt="" class="wp-image-1312" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font.jpg?v=1597073599 1024w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-300x300.jpg?v=1597073599 300w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-150x150.jpg?v=1597073599 150w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-768x768.jpg?v=1597073599 768w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-640x640.jpg?v=1597073599 640w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-830x830.jpg?v=1597073599 830w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-230x230.jpg?v=1597073599 230w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-350x350.jpg?v=1597073599 350w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-480x480.jpg?v=1597073599 480w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-50x50.jpg?v=1597073599 50w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>如果透過指令來做會更有效率的話，當然要使用指令來做。這個指令還滿常使用到的，因為字體常常在補字，一定會用到合併的功能。</p>



<p>GUI 的操作參考使用下面的這篇分享：合併字型較安全的方法<br><a href="https://codereview.max-everyday.com/a-safer-way-to-merge-fonts/">https://codereview.max-everyday.com/a-safer-way-to-merge-fonts/</a></p>



<p>這篇教學示範2個解法: </p>



<ul class="wp-block-list">
<li>解法1: 透過 fontforge + .pe 檔.</li>



<li>解法2: python + fonttool</li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">解法1: 透過 fontforge + .pe 檔.</h2>



<p>使用前，需要先安裝FontForge，透過執行FontForge的腳本(Script)可以在指令行的模式下，合併2個字體檔案。</p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/merge_font.pe">https://github.com/max32002/MaxFontScripts/blob/master/merge_font.pe</a></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="797" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-01-at-15.56.37b-1024x797.png" alt="" class="wp-image-28"/></figure>



<p>MaxCodeReview 影片：<br><a href="https://youtu.be/SFCf50iiQbs">https://youtu.be/SFCf50iiQbs</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">解法1使用範例</h2>



<pre class="wp-block-code"><code>merge_font.pe main.ttf added.ttf outout.sfdir</code></pre>



<p>說明：前二個參數，由於是使用 FontForge 去開啟，不限於 .ttf 或 .sfdir 格式，都可以被順利開啟。</p>



<p>第三個參數，目前的腳本固定要使用  .sfdir 格式，因為是使用 Save() 指令，如果是要產生成 .ttf 要改用 Generate().</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">解法2: python + fonttool</h2>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/merge_font.py">https://github.com/max32002/MaxFontScripts/blob/master/merge_font.py</a></p>



<p>使用範例:</p>



<pre class="wp-block-code"><code>python merge_font.py --font1 font1.ttf --font2 font2.ttf --output font3.ttf</code></pre>



<p>執行畫面:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1254" height="205" src="https://codereview.max-everyday.com/wp-content/uploads/2020/07/2025-01-24_14-05_5l.jpg?v=1737698768" alt="" class="wp-image-1705" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/07/2025-01-24_14-05_5l.jpg?v=1737698768 1254w, https://codereview.max-everyday.com/wp-content/uploads/2020/07/2025-01-24_14-05_5l-1000x163.jpg?v=1737698768 1000w, https://codereview.max-everyday.com/wp-content/uploads/2020/07/2025-01-24_14-05_5l-230x38.jpg?v=1737698768 230w, https://codereview.max-everyday.com/wp-content/uploads/2020/07/2025-01-24_14-05_5l-350x57.jpg?v=1737698768 350w, https://codereview.max-everyday.com/wp-content/uploads/2020/07/2025-01-24_14-05_5l-480x78.jpg?v=1737698768 480w" sizes="(max-width: 1254px) 100vw, 1254px" /></figure>



<p>使用這個解法, 比較方便與安全, 缺點就是合併完的檔案, 在作業系統雖然可以使用, 但無法被 fontforge 開啟.</p>



<p>當 font1 與 font2 同時都有的字元, 會以 font2 被保留下來, 理論上應該是, 但實際上, 有時候會以 font2 為主, 有時候並不會被取代.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">相關網頁</h2>



<p>FontForge Scripting Tutorial<br><a href="https://fontforge.org/docs/tutorial/scripting-tutorial.html">https://fontforge.org/docs/tutorial/scripting-tutorial.html</a></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
