2

当资产在文件名中包含 unicode 字符时,例如中文或阿拉伯文,该文件无法部署到包中,它会出错。

将文件重命名为 ANSI 字符可以修复它。

有没有办法让 MonoDevelop + MonoDroid 部署 unicode 资产?

4

2 回答 2

6

我在任何地方都找不到此文档,但资产文件名必须是 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有这个要求。

于 2012-05-22T20:20:10.993 回答
3

我从 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() 的值。)

于 2012-05-22T20:42:43.310 回答