当资产在文件名中包含 unicode 字符时,例如中文或阿拉伯文,该文件无法部署到包中,它会出错。
将文件重命名为 ANSI 字符可以修复它。
有没有办法让 MonoDevelop + MonoDroid 部署 unicode 资产?
当资产在文件名中包含 unicode 字符时,例如中文或阿拉伯文,该文件无法部署到包中,它会出错。
将文件重命名为 ANSI 字符可以修复它。
有没有办法让 MonoDevelop + MonoDroid 部署 unicode 资产?
我在任何地方都找不到此文档,但资产文件名必须是 ASCII,因为这是该aapt
工具所需要的:
/*
* Names of asset files must meet the following criteria:
*
* - the filename length must be less than kMaxAssetFileName bytes long
* (and can't be empty)
* - all characters must be 7-bit printable ASCII
* - none of { '/' '\\' ':' }
*
* Pass in just the filename, not the full path.
*/
static bool validateFileName(const char* fileName)
{
const char* cp = fileName;
size_t len = 0;
while (*cp != '\0') {
if ((*cp & 0x80) != 0)
return false; // reject high ASCII
if (*cp < 0x20 || *cp >= 0x7f)
return false; // reject control chars and 0x7f
if (strchr(kInvalidChars, *cp) != NULL)
return false; // reject path sep chars
cp++;
len++;
}
if (len < 1 || len > kMaxAssetFileName)
return false; // reject empty or too long
return true;
}
我不知道为什么 Android/aapt
有这个要求。
我从 MonoDroid 团队那里得到了这个(感谢 jonp),它可以工作:
由于 Android 不支持 Unicode 资产文件名,您可以改为将文件的 Build 操作设置为 EmbeddedResource 并使用 .NET 资源来访问资源:
using (var s = new StreamReader (typeof (Activity1).Assembly
.GetManifestResourceStream ("Úñîćödę.txt")))
button.Text = s.ReadToEnd ();
(您可能需要更改文件的 Resource ID 属性以匹配传递给 Assembly.GetManifestResourceStream() 的值。)