<?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>&amp;# &#8211; 記下來</title>
	<atom:link href="https://noter.tw/tag/58/feed/" rel="self" type="application/rss+xml" />
	<link>https://noter.tw</link>
	<description>一路上踩到的坑、遇到的問題，一點一滴記下來，希望能幫助到需要的人~</description>
	<lastBuildDate>Fri, 10 Nov 2023 08:19:29 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.3</generator>

<image>
	<url>https://noter.tw/wp-content/uploads/cropped-old-1130742_1920-1-32x32.jpg</url>
	<title>&amp;# &#8211; 記下來</title>
	<link>https://noter.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>NCR &#038;#xxxxx; 處理方式：Java &#038; VBA</title>
		<link>https://noter.tw/119/ncr-%e8%99%95%e7%90%86%e6%96%b9%e5%bc%8f%ef%bc%9ajava-vba/</link>
					<comments>https://noter.tw/119/ncr-%e8%99%95%e7%90%86%e6%96%b9%e5%bc%8f%ef%bc%9ajava-vba/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Mon, 16 Jul 2018 14:54:25 +0000</pubDate>
				<category><![CDATA[網頁後端]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[decimal]]></category>
		<category><![CDATA[NCR]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[&#]]></category>
		<guid isPermaLink="false">https://noter.tw/?p=119</guid>

					<description><![CDATA[<p>工作上常常需要把資料庫的東西匯出，但有一些資料是以&#160;NCR (Numeric Character Reference) 的方式儲存或呈現，這些在網頁上看都沒有什麼問題，但在 Excel 裡面&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/119/ncr-%e8%99%95%e7%90%86%e6%96%b9%e5%bc%8f%ef%bc%9ajava-vba/" data-wpel-link="internal">NCR &#038;#xxxxx; 處理方式：Java &#038; VBA</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>工作上常常需要把資料庫的東西匯出，但有一些資料是以&nbsp;NCR (Numeric Character Reference) 的方式儲存或呈現，這些在網頁上看都沒有什麼問題，但在 Excel 裡面「你好嗎」如果是 NCR 就會看到這樣「你好嗎」，這邊記錄用 VBA 跟 Java 個別的處理方式。</p>



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



<p>先來搞清楚 NCR 的構成吧！大致上會是以 &amp;# 開頭，中間串接個數字，最後以分號 ; 結尾，大概就是像這樣</p>



<p>你 =&gt;&nbsp;&amp;#20320;<br>好 =&gt;&nbsp;&amp;#22909;<br>嗎 =&gt;&nbsp;&amp;#21966;</p>



<p>上面幾個是 Decimal NCR 十進位制的 NCR，下面放幾個 16 進制的 NCR 來比較看看</p>



<p>你 =&gt;&nbsp;&amp;#x4F60;<br>好 =&gt;&nbsp;&amp;#x597D;<br>嗎 =&gt;&nbsp;&amp;#x55CE;</p>



<p>想要知道 10 進位跟 16 進位 NCR 的請前往<a href="https://zh.wikipedia.org/wiki/字符值引用" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">維基百科<span class="wpel-icon wpel-image wpel-icon-6"></span></a>，小蛙這邊簡單歸納自己的做法：</p>



<ol class="my-li bg-darkblue wp-block-list">
<li>10 進制的 pattern 為 &amp;#(wwwww);&nbsp; &nbsp; -&gt; w 為 10 進制數字</li>



<li>16 進制的 pattern 為 &amp;#x(hhhh);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-&gt; h 為 16 進制</li>
</ol>



<h2 class="wp-block-heading para">Java 版本 NCR 處理</h2>



<p>Java code 是大概寫一下，裡面沒有加入任何防呆跟錯誤處理，例如：Integer.parseInt 這邊有可能 parse 到不是 integer 而拋出錯誤，請務必注意(乖小孩要自己加上喔)；或是 pattern 可以寫得更限縮一些。這次主要是要放上 VBA 的 Code，順道把 Java 的一起擺上來<del>作為紀念</del>幫助有需要的人，看出哪裡有問題的就 &#8230; 自己修改囉！也可以在下面留言給小蛙 ~ 感恩！</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">public static String convertDecimalNCRToString(String txt){
	Pattern p = Pattern.compile("&amp;#(.*?);");
	Matcher m = p.matcher(txt);
	while(m.find()){
		String match = m.group(1);
		if(!match.startsWith("x")){
			txt = txt.replaceAll("&amp;#" + m.group(1) + ";", "" + (char)Integer.parseInt(m.group(1)));				
		}else{
			txt = txt.replaceAll("&amp;#" + m.group(1) + ";", "" + (char)Integer.parseInt(m.group(1).replaceFirst("x", ""), 16));
		}
	}
	return txt;
}</pre>



<h2 class="wp-block-heading">VBA 版本 NCR 處理</h2>



<p>放上 VBA 的 Code，大致上的概念是差不多的，不過這裡要注意，小蛙剛好有機會想說寫看看 VBA，New RegExp 用這個類別的時候，不知道怎麼用一直出現未定義的錯誤，後來才知道要去設定 References，<a href="https://stackoverflow.com/a/43128681" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">參考這裡<span class="wpel-icon wpel-image wpel-icon-6"></span></a>。另外，要列出最後一列的寫法是&nbsp;Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row，最後一欄的寫法是 Cells(1, ActiveSheet.Columns.Count).End(xlToLeft).Column，如果用到的是 excel 內建函數或方法的話，前面要加上&nbsp;WorksheetFunction.。</p>



<p> 2018-07-24 更新：</p>



<p>原本的寫法會造成 〹〹 這種連續 NCR 解析錯誤 Orz&#8230; 加上每次都要設定 References 感覺很麻煩，也改寫成 CreateObject(&#8220;vbscript.regexp&#8221;)，這樣以後可以直接使用，不用再去設定 References。(注意：如果 excel 裡的 NCR 非常多，執行的時候會很慢，請耐心等待) </p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">Sub ConvNCR()
    'Dim regex As New RegExp
    Dim regex As Object
    Set regex = CreateObject("vbscript.regexp")
    Dim i, j As Integer
    Dim s As String
    Dim r As String
    
    'pattern of Decimal NCR
    regex.Pattern = "&amp;#((\w+));"
    regex.Global = True
    regex.IgnoreCase = True
    regex.MultiLine = True
          
    For i = 1 To Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
        For j = 1 To Cells(1, ActiveSheet.Columns.Count).End(xlToLeft).Column
            s = Cells(i, j).Value
            r = s
            If Not IsNull(s) Then
                If regex.Test(s) Then
                    c = regex.Execute(s).Count
                    For w = 0 To c - 1
                        t = regex.Execute(s)(w).SubMatches(0)
                        If InStr(t, "x") Then
                           'to deal with hex NCR ሴ
                            t = WorksheetFunction.Hex2Dec(Right(t, 4))
                        End If
                        'relace by real "word"
                        r = Replace(r, regex.Execute(s)(w), WorksheetFunction.Unichar(t), , 1)
                        Cells(i, j).Value = r
                    Next w
                End If
            End If
        Next j
    Next i
End Sub</pre>



<p>以上，有需要的人夾去配吧！最後附上很有用的 <a href="https://r12a.github.io/app-conversion/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">編碼轉換工具<span class="wpel-icon wpel-image wpel-icon-6"></span></a> (iframe 內嵌於<a href="https://noter.tw/12003/unicode-code-converter-特殊字元轉換器/" data-wpel-link="internal">本站</a>) 以及 <a href="https://itw01.com/V48OESL.html" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">Javascript 轉換方式<span class="wpel-icon wpel-image wpel-icon-6"></span></a>。</p>



<p><strong>Excel 相關文章：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/9117/excel-filter-and-validation/" data-wpel-link="internal">加入篩選器及下拉選單 (資料驗證)</a></li><li><a href="https://noter.tw/9063/excel-auto-search-and-fill-data-by-vlookup-index-match/" data-wpel-link="internal">搜尋表格 填入資料 強大的 VLOOKUP, INDEX, MATCH</a></li><li><a href="https://noter.tw/9061/split-a-excel-to-files/" data-wpel-link="internal">分拆 Excel 成多個檔案 ( Split A Excel to Files)</a></li><li><a href="https://noter.tw/6550/excel-%e4%bd%bf%e7%94%a8-poi-%e8%ae%80%e5%8f%96%e6%96%87%e5%ad%97%e6%a0%bc%e5%bc%8f%e6%97%a5%e6%9c%9f%e5%8d%bb%e8%ae%8a%e6%88%90%e6%95%b8%e5%ad%97%e7%9a%84%e5%95%8f%e9%a1%8c/" data-wpel-link="internal">Excel 使用 POI 讀取文字格式日期卻變成數字的問題</a></li><li><a href="https://noter.tw/4300/java-%e8%ae%80%e5%8f%96-excel-%e6%96%87%e4%bb%b6xls-xlsx-%e4%bd%bf%e7%94%a8-apache-poi/" data-wpel-link="internal">Java 讀取 Excel 文件(xls, xlsx) – 使用 Apache POI</a></li><li><a href="https://noter.tw/2711/oracle-%e5%8c%af%e5%85%a5%e5%8c%af%e5%87%ba-excel-%e9%80%8f%e9%81%8e-sql-developer/" data-wpel-link="internal">Oracle 匯入/匯出 Excel (透過 SQL Developer)</a></li><li><a href="https://noter.tw/1732/jsp%e5%b0%87%e8%b3%87%e6%96%99%e5%8c%af%e5%87%ba%e6%88%90excel%e7%9b%b4%e6%8e%a5%e4%b8%8b%e8%bc%89-by-jexcelapi-jxl/" data-wpel-link="internal">JSP將資料匯出成Excel直接下載 by JExcelApi (jxl)</a></li><li><a href="https://noter.tw/1569/java-excel-jxl/" data-wpel-link="internal">Java + Excel = JXL</a></li><li><a href="https://noter.tw/119/ncr-%e8%99%95%e7%90%86%e6%96%b9%e5%bc%8f%ef%bc%9ajava-vba/" data-wpel-link="internal">NCR &amp;#xxxxx; 處理方式：Java &amp; VBA</a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/119/ncr-%e8%99%95%e7%90%86%e6%96%b9%e5%bc%8f%ef%bc%9ajava-vba/" data-wpel-link="internal">NCR &#038;#xxxxx; 處理方式：Java &#038; VBA</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/119/ncr-%e8%99%95%e7%90%86%e6%96%b9%e5%bc%8f%ef%bc%9ajava-vba/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
