The terms are different, and they refer to differing expectations.
Usually, "Software Engineer" is a superset of "Programmer".
Programming computers is PART of Software Engineering; but it's by far not all of it.
While programming requires a knowledge of computer languages and algorithms and data structures, all of which are very important, software engineering also involves knowledge of projects, maintenance requirements, documentation standards, software design, etc. The things that are involved in successful software projects that are NOT actual programming.
For me, a critical distinction has always come with Software Patterns. I've never met someone who was "just" a programmer who had a grasp on what they are, and why they're good. Conversely, most (albeit not all) Software Engineers that I've known and respected have had a good grasp on Software Patterns, and understand why they're such a good idea.
In general, the way I tend to think of it is this: programmers program solutions. Software engineers take a problem, and (usually) use programming to solve it. The difference is that at least part of the responsibility for figuring out WHAT the solution is going to be falls on the Software Engineers.