<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>al_load_bitmap and unicode characters in filename</title>
		<link>http://www.allegro.cc/forums/view/612072</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 19 Feb 2013 21:05:29 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello,</p><p>when I try to load images with unicode characters in the file name, it fails.<br />I did little digging, and found out, that the code should handle wide char conversion for the file name actually breaks it.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">static</span> <span class="k1">void</span> <span class="k3">*</span>file_stdio_fopen<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>path, <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>mode<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>   FILE <span class="k3">*</span>fp<span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span><span class="p">#ifdef ALLEGRO_WINDOWS</span>
<span class="number">  6</span>   <span class="k2">{</span>
<span class="number">  7</span>      <span class="k1">wchar_t</span> <span class="k3">*</span>wpath <span class="k3">=</span> _al_win_utf16<span class="k2">(</span>path<span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>      <span class="k1">wchar_t</span> <span class="k3">*</span>wmode <span class="k3">=</span> _al_win_utf16<span class="k2">(</span>mode<span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>      fp <span class="k3">=</span> _wfopen<span class="k2">(</span>wpath, wmode<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>      <a href="http://www.allegro.cc/manual/al_free"><span class="a">al_free</span></a><span class="k2">(</span>wpath<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>      <a href="http://www.allegro.cc/manual/al_free"><span class="a">al_free</span></a><span class="k2">(</span>wmode<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>   <span class="k2">}</span>
<span class="number"> 13</span><span class="p">#else</span>
<span class="number"> 14</span>   fp <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_337.html" target="_blank">fopen</a><span class="k2">(</span>path, mode<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span><span class="p">#endif</span>
<span class="number"> 16</span>
<span class="number"> 17</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>fp<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 18</span>      <a href="http://www.allegro.cc/manual/al_set_errno"><span class="a">al_set_errno</span></a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_293.html" target="_blank">errno</a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>      <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 20</span>   <span class="k2">}</span>
<span class="number"> 21</span>
<span class="number"> 22</span>   <span class="k1">return</span> fp<span class="k2">;</span>
<span class="number"> 23</span><span class="k2">}</span>
</div></div><p>

When I changed the ifdef ALLEGRO_WINDOWS to #if 0 (sing the non-windows variant), it started working, and I could load those files.</p><p>I&#39;m probably doing something the wrong way, but not sure what is it, I&#39;m no expert of wide string/utf 8.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kovarex)</author>
		<pubDate>Tue, 19 Feb 2013 19:10:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Then you&#39;re probably not providing a UTF-8 path. Sample code?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Tue, 19 Feb 2013 19:35:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The part of the filename that contains invalid characteres (User name on windows, while accessing the User/&lt;Username&gt;/AppData/Roaming ...</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>boost::filesystem::path Paths::getSystemWriteData<span class="k2">(</span><span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  TCHAR szPath<span class="k2">[</span>MAX_PATH<span class="k2">]</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>  <span class="k1">if</span> <span class="k2">(</span>SUCCEEDED<span class="k2">(</span>SHGetFolderPath<span class="k2">(</span>NULL,
<span class="number">  6</span>                                CSIDL_APPDATA <span class="k3">|</span> CSIDL_FLAG_CREATE,
<span class="number">  7</span>                                NULL,
<span class="number">  8</span>                                <span class="n">0</span>,
<span class="number">  9</span>                                szPath<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span>
<span class="number"> 10</span>  <span class="k2">{</span>
<span class="number"> 11</span>    boost::filesystem::path result <span class="k3">=</span> boost::filesystem::path<span class="k2">(</span>szPath<span class="k2">)</span> <span class="k3">/</span> <span class="s">"Factorio"</span><span class="k2">;</span>
<span class="number"> 12</span>    boost::filesystem::create_directories<span class="k2">(</span>result<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>    <span class="k1">return</span> result<span class="k2">;</span>
<span class="number"> 14</span>  <span class="k2">}</span>
<span class="number"> 15</span>  <span class="k1">else</span>
<span class="number"> 16</span>    <span class="k1">throw</span> std::runtime_error<span class="k2">(</span><span class="s">"Couldn't get application data directory"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span><span class="k2">}</span>
</div></div><p>

Later I just make string out of the path (path / &quot;preview image path&quot;).string() and send it to the allegro.</p><p>You can see, that boost has no problem with creating the directory that contains the unicode character.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kovarex)</author>
		<pubDate>Tue, 19 Feb 2013 20:21:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>.string() returns a std::string, you still need to convert it to a sequence of UTF-8 to pass it to <span class="source-code"><a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span><span class="k2">)</span></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Tue, 19 Feb 2013 21:02:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Also have to make sure its in UTF-8, rather than the UTF-16 that windows returns.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 19 Feb 2013 21:05:29 +0000</pubDate>
	</item>
</rss>
