If the character is a member of a character set then it has non-zero length. This includes the ASCII "NUL" character - which of course is not NULL and (oddly enough) not a zero-length string either.
In general, when you want to perform this kind of test, you have at least a clue as to what you would expect if it is populated. That is, you know it is a string or an integer. So what you typically have to do in these cases is to pick the NZ variant that comes closest to your expected data type.
If NZ( variable, 0 ) = 0 then {do whatever you do for a null or zero answer}
If NZ( variable, "" ) = "" then {do whatever you do for a null or zero-length-string answer}
Note the special case mentioned earlier - that a sequence of blanks ALSO could occur. That would NOT be a zero-length-string case. This would mean that you would need to decide what a blank sequence means before deciding how to handle it programmatically.
I suppose it is possible to design one "special function" that covers all the cases and all the bases - but I tend to think of such things as a bit of overkill. If you have such a routine, it should be OK to use. But don't go writing something special when you can just pick the right form of NZ(x,v) to apply to your needs.