Most CSVs travel through excel at some point in their lives, so we need to talk about excel:
Excel neither reads nor writes UTF-8 CSV files without jumping through hoops.
Excel saves files in different character sets on MacOS and Windows.
Excel tries to interpret fields with digits as numbers, stripping off leading 0's, etc. (think serial numbers or whatever with leading 0's)
Excel will try and interpret date fields and write them out in a different format.
Outside of Excel:
There is no way to know what character set a CSV file is encoded in. You can only guess.
UTF BOM - sometimes there, sometimes not.
If the file is malformed but still opens in Excel it is a bug in your CSV parser, and not a problem with the producer of the file (so they will tell you)
Most CSV libraries are extremely buggy and cannot generate CSV to spec.
Most CSV libraries are extremely buggy and cannot read CSV that meets spec.
Many programmers think CSV is easy and do not use a library go generate or read CSV producing even worse results than their language's buggy CSV library.
The spec is just a suggestion
Nobody reads the spec
That's just the tip of the iceberg