<?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>字串 &#8211; 隨心所欲</title>
	<atom:link href="https://doeverythingiwant.com/tag/%e5%ad%97%e4%b8%b2/feed/" rel="self" type="application/rss+xml" />
	<link>https://doeverythingiwant.com</link>
	<description>iOS Developer 的隨筆記錄</description>
	<lastBuildDate>Mon, 20 Nov 2023 15:12:46 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://doeverythingiwant.com/wp-content/uploads/2025/08/cropped-0802.png</url>
	<title>字串 &#8211; 隨心所欲</title>
	<link>https://doeverythingiwant.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>[iOS] Swift &#8211; 五十音排序</title>
		<link>https://doeverythingiwant.com/ios-swift-japanese/</link>
					<comments>https://doeverythingiwant.com/ios-swift-japanese/#respond</comments>
		
		<dc:creator><![CDATA[艾普利]]></dc:creator>
		<pubDate>Sun, 28 Aug 2022 07:42:00 +0000</pubDate>
				<category><![CDATA[寫程式]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[五十音]]></category>
		<category><![CDATA[字串]]></category>
		<guid isPermaLink="false">https://doeverythingiwant.com/?p=121</guid>

					<description><![CDATA[Swift 的String 是 Unicode String&#8230;]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Swift 的String 是 Unicode String 因此使用<strong>Sort(by:)</strong> 時自然是使用Unicode 排序</p>



<p class="wp-block-paragraph">這樣的好處是無論是什麼樣的文字，找得到Unicode 編碼就可以排序</p>



<span id="more-121"></span>



<figure class="wp-block-pullquote"><blockquote><p><strong>什麼是Unicode?</strong></p><cite><strong>Unicode是一種文字編碼方式，常見的有UTF-8 與 UTF-16，最顯而易見的差別在於位元數的不同</strong><br><strong>由於Unicode幾乎包含所有文字，因此在Swift 裡基本上所以文字都可以使用 Sort(by:)來排序</strong></cite></blockquote></figure>



<p class="wp-block-paragraph">但是問題來了，使用Unicode排序是很方便沒錯，但是卻可能與認知的文字排序不同</p>



<p class="wp-block-paragraph">就拿專案上遇到的日文字來舉例</p>



<p class="wp-block-paragraph">由於日文有平假名與片假名，若直接使用Unicode來排序的話，發生 <strong>あ &lt; ア</strong> 的情況，這是因為Unicode 的編碼中 <strong>あ </strong>是排在 <strong>ア</strong> 的前面，排序的時候自然就會出現 <strong>あ &lt; ア</strong>的情況，看起來很合理沒什麼問題</p>



<p class="wp-block-paragraph">但問題在於對於日本人來說 あ = ア 所以它們在順序上是同等的，那該怎麼辨呢?</p>



<figure class="wp-block-image is-resized"><a href="https://1.bp.blogspot.com/-yV7W7UHYHaU/Xr-XNPACHzI/AAAAAAAADKk/NK_o1UflriU0QDzGsnhpbcTRB9oUQKuQgCK4BGAsYHg/%25E6%2588%25AA%25E5%259C%2596%2B2020-05-16%2B%25E4%25B8%258B%25E5%258D%25883.32.43.png" target="_blank" rel="noopener"><img fetchpriority="high" decoding="async" src="https://1.bp.blogspot.com/-yV7W7UHYHaU/Xr-XNPACHzI/AAAAAAAADKk/NK_o1UflriU0QDzGsnhpbcTRB9oUQKuQgCK4BGAsYHg/w400-h269/%25E6%2588%25AA%25E5%259C%2596%2B2020-05-16%2B%25E4%25B8%258B%25E5%258D%25883.32.43.png" alt="" width="540" height="363"/></a></figure>



<p class="wp-block-paragraph">這時候就請出Google 大神!!! 在 Google 大神的幫忙下有找到了日本開發者寫的方法</p>



<p class="wp-block-paragraph"><a href="https://gist.github.com/mizn/769a0c47bbbe4601ffd0" rel="noreferrer noopener" target="_blank">Stringクラスにひらがな・カタカナ変換をextensionする</a></p>



<p class="wp-block-paragraph">這個解法簡單來說就是先把平假名轉成片假名，或是把片假名轉成平假名之後，再使用Sort 來排序</p>



<p class="wp-block-paragraph">這樣排出來的就會是完美的五十音順啦~&nbsp; 趕快來試用看看吧…</p>



<p class="wp-block-paragraph">呃…</p>



<p class="wp-block-paragraph"><strong>ERROR…</strong></p>



<figure class="wp-block-image is-resized"><a href="https://1.bp.blogspot.com/-N_ifDnt3o3k/Xr1VmDJDM2I/AAAAAAAADJQ/elyOhLHvT2Aqt9-9u0gXD3BiE4j_fVoggCK4BGAsYHg/2020051402.png" target="_blank" rel="noopener"><img decoding="async" src="https://1.bp.blogspot.com/-N_ifDnt3o3k/Xr1VmDJDM2I/AAAAAAAADJQ/elyOhLHvT2Aqt9-9u0gXD3BiE4j_fVoggCK4BGAsYHg/w640-h88/2020051402.png" alt="" width="910" height="125"/></a></figure>



<p class="wp-block-paragraph">研究了一下子，終於發現了問題點，只要改寫成下面這樣就可以了</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-swift" data-lang="Swift"><code>if char.value &gt;= 0x30A1 && char.value &lt;= 0x30F6 {
	if let code = UnicodeScalar(char.value - 96) {
    	hiragan.append(Character(code))
    } else {
    	hiragan.append(Character(code))
    }
}</code></pre></div>



<h3 class="wp-block-heading">主要原因</h3>



<p class="wp-block-paragraph">是現在的(Swift 5) append只有提供這些方式</p>



<figure class="wp-block-image is-resized"><a href="https://1.bp.blogspot.com/-o3cV1Ru8deA/Xr1V1fLrVOI/AAAAAAAADJk/_ABvQfBqu0wDHBxGdY4-6p9pZ6FO0x9vgCK4BGAsYHg/2020051401.png" target="_blank" rel="noopener"><img decoding="async" src="https://1.bp.blogspot.com/-o3cV1Ru8deA/Xr1V1fLrVOI/AAAAAAAADJk/_ABvQfBqu0wDHBxGdY4-6p9pZ6FO0x9vgCK4BGAsYHg/w640-h142/2020051401.png" alt="" width="807" height="177"/></a></figure>



<p class="wp-block-paragraph">因此Github中原本使用的方式就不能用了，已經不能直接把UnicodeScalar加到String裡，必需要轉成Character之後才能丟進去</p>



<p class="wp-block-paragraph">把轉換method改寫完之後，就可以排出 あ = ア 的五十音排序了</p>



<figure class="wp-block-image is-resized"><a href="https://1.bp.blogspot.com/-CiCmLS2VBbM/Xr-Y38yGPNI/AAAAAAAADLI/znWcO5hdnXYOkdFolWi6zohQ9-dNP61eQCK4BGAsYHg/%25E6%2588%25AA%25E5%259C%2596%2B2020-05-16%2B%25E4%25B8%258B%25E5%258D%25883.40.05.png" target="_blank" rel="noopener"><img loading="lazy" decoding="async" src="https://1.bp.blogspot.com/-CiCmLS2VBbM/Xr-Y38yGPNI/AAAAAAAADLI/znWcO5hdnXYOkdFolWi6zohQ9-dNP61eQCK4BGAsYHg/w400-h194/%25E6%2588%25AA%25E5%259C%2596%2B2020-05-16%2B%25E4%25B8%258B%25E5%258D%25883.40.05.png" alt="" width="639" height="310"/></a></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://doeverythingiwant.com/ios-swift-japanese/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
