Thanks for the advice, guys. I was wrong about what FOP was doing. The problem was simply that I wasn't specifying UTF-8 in my Java code when I wrote the XML string out to System.out, so it was being output in ISO-8859-1 and the characters outside that character set were just getting mangled.