单声道为Android:Unicode的资产文件名不能打包(Mono for Android: Un

2019-09-17 04:10发布

当资产包含在文件名中的Unicode字符,例如中国或阿拉伯语,该文件不能被部署到一个包时,它的错误了。

重命名文件,以ANSI字符修复它。

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

Answer 1:

我找不到任何地方这样记载,但资产的文件名必须为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有此要求。



Answer 2:

我得到这个从MonoDroid的团队(感谢jonp)和它的工作原理:

由于Android不支持Unicode资源文件名,可以改为设置文件的生成操作EmbeddedResource并使用.NET资源访问资源:

  using (var s = new StreamReader (typeof (Activity1).Assembly
       .GetManifestResourceStream ("Úñîćödę.txt")))
   button.Text = s.ReadToEnd ();

(您可能需要更改文件以匹配传递给Assembly.GetManifestResourceStream()的值的资源ID属性。)



文章来源: Mono for Android: Unicode Assets file names can't be packaged