Hello Torsten, Thanks for answering. Answering to your question, I removed the comments with "rebase" since my reported encoding issue happens on more simpler operations (described in the PR), and the problem is not directly related to rebasing, so I considered it better in order to avoid unrelated confusions. Let's get back to the problem. Each system has a default endianness. Also, in .gitattributes's working-tree-encoding, Git behaves differently depending on the attribute's value and the contents of the referenced entry file. When I put the value "UTF-16", then the file must have a BOM, or Git complains. Otherwise, if I put the value "UTF-16BE" or "UTF-16LE", then Git prohibites operations if file has a BOM for that main encoding (UTF-16 here), which can be relate to any endianness. My very initial goal was, given a UTF-16LE file, to be able to view human-readable diffs whenever I make a change on it (and yes, it must be Little Endian). Plus, this file had a BOM. Now, what are the options with Git currently (consider only working-tree-encoding)? If I put working-tree-encoding=UTF-16, then I could view readable diffs and commit the file, but here is the main problem: Git looses information about what initial endianness the file had, therefore, after staging/committing it re-encodes the file from UTF-8 (as stored internally) to UTF-16 and the default system endianness. In my case it did to Big Endian, thus affecting the project's requirement. That is why I ended up writing a fixup script to change the encoding back to UTF-16LE. On the other hand, once I set working-tree-encoding=UTF-16LE, then Git prohibited me from committing the file and even viewing human-readable diffs (the output simply tells it's a binary file). In this sense, the internal location of these errors is within the function of utf8.c I made changes to in the PR. I hope I was clearer! Finally, Git behaviour around this is based on Unicode standards, which is why I acknowledged that my changes violated them after refering to a link which is present in the ut8.h file. El mar., 6 nov. 2018 a las 21:16, Torsten Bögershausen (<tboegi@xxxxxx>) escribió: > > On Mon, Nov 05, 2018 at 07:10:14PM +0100, Torsten Bögershausen wrote: > > On Mon, Nov 05, 2018 at 05:24:39AM +0100, Adrián Gimeno Balaguer wrote: > > > > [] > > > > > https://github.com/git/git/pull/550 > > > > [] > > > > > This is covered in the mentioned PR above. Thanks for feedback. > > > > Thanks for the code, > > I will have a look (the next days) > > > > > > > > -- > > > Adrián > > Hej Adrián, > > I still didn't manage to fully understand your problem. > I tried to convert your test into my understanding, > It can be fetched here (or copied from this message, see below) > > https://github.com/tboegi/git/tree/tb.181106_UTF16LE_commit > > The commit of an empty file seems to work for me, in the initial > report a "rebase" was mentioned, which is not in the TC ? > > Is the following what you intended to test ? > > #!/bin/sh > test_description='UTF-16 LE/BE file encoding using working-tree-encoding' > > > . ./test-lib.sh > > # We specify the UTF-16LE BOM manually, to not depend on programs such as iconv. > utf16leBOM=$(printf '\377\376') > > test_expect_success 'Stage empty UTF-16LE file as binary' ' > >empty_0.txt && > echo "empty_0.txt binary" >>.gitattributes && > git add empty_0.txt > ' > > > test_expect_success 'Stage empty file with enc=UTF.16BL' ' > >utf16le_0.txt && > echo "utf16le_0.txt text working-tree-encoding=UTF-16BE" >>.gitattributes && > git add utf16le_0.txt > ' > > > test_expect_success 'Create and stage UTF-16LE file with only BOM' ' > printf "$utf16leBOM" >utf16le_1.txt && > echo "utf16le_1.txt text working-tree-encoding=UTF-16" >>.gitattributes && > git add utf16le_1.txt > ' > > test_expect_success 'Dont stage UTF-16LE file with only BOM with enc=UTF.16BE' ' > printf "$utf16leBOM" >utf16le_2.txt && > echo "utf16le_2.txt text working-tree-encoding=UTF-16BE" >>.gitattributes && > test_must_fail git add utf16le_2.txt > ' > > test_expect_success 'commit all files' ' > test_tick && > git commit -m "Commit all 3 files" > ' > > test_expect_success 'All commited files have the same sha' ' > git ls-files -s --eol >tmp1 && > sed -e "s! i/none.*!!" <tmp1 | uniq -u >actual && > >expect && > test_cmp expect actual > ' > > test_done -- Adrián