<div dir="ltr"><div>All my upload forms have accept-charset=&quot;utf-8&quot;.    We expect that uploaded filenames could have wide-characters.</div><div><br></div>The problem I hit was -&gt;basename does this:<div><br></div><div><div>$ perl -le &#39;use Catalyst::Request::Upload; my $upload = Catalyst::Request::Upload-&gt;new( { filename =&gt; q[документ обучения.pdf] } ); print $upload-&gt;basename;&#39;</div><div>_.pdf</div><div><br></div><div>That&#39;s pretty mangled.</div><div><br></div><div><br></div><div>The problem is that $upload-&gt;filename is not decoded so the substitution is working on octets not characters. </div><div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font face="monospace">sub _build_basename {</font></div></div><div><div><font face="monospace">    my $self = shift;</font></div></div><div><div><font face="monospace">    my $basename = $self-&gt;filename;</font></div></div><div><div><font face="monospace">    $basename =~ s|\\|/|g;</font></div></div><div><div><font face="monospace">    $basename = ( File::Spec::Unix-&gt;splitpath($basename) )[2];</font></div></div><div><div><font face="monospace">    $basename =~ s|[^\w\.-]+|_|g;</font></div></div><div><div><font face="monospace">    return $basename;</font></div></div><div><div><font face="monospace">}</font></div></div></blockquote><div><div><br></div><div>Obviously, we want \w to work on characters, not encoded octets.   Decoding the filename should be done -- it&#39;s character data.</div><div><br></div><div>Does it make sense to do it in Engine&#39;s prepare_uploads?</div><div><br></div><div>For example:</div><div><br></div><div><div><font face="monospace">            my $u = Catalyst::Request::Upload-&gt;new(</font></div><div><font face="monospace">               size =&gt; $upload-&gt;{size},</font></div><div><font face="monospace">               type =&gt; scalar $headers-&gt;content_type,</font></div><div><font face="monospace">               headers =&gt; $headers,</font></div><div><font face="monospace">               tempname =&gt; $upload-&gt;{tempname},</font></div><div><font face="monospace">               filename =&gt; <b>$c-&gt;_handle_unicode_decoding($upload-&gt;{filename})</b>,</font></div><div><font face="monospace">            );</font></div></div><div><br></div><div><br></div>-- <br><div class="gmail_signature">Bill Moseley<br><a href="mailto:moseley@hank.org" target="_blank">moseley@hank.org</a></div>
</div></div></div></div>